Nucleo-F411RE (STM32F411)LL库体验 4 -Letter Shell移植与调试

news/2024/11/30 20:43:52/

Nucleo-F411RE (STM32F411)LL库体验 4 -Letter Shell移植与使用

1、串口的初始化

Nucleo-F411RE自带st-link,并支持虚拟串口的功能,根据原理图,st-link的rx tx接到了Nucleo-F411RE的PA2 PA3,所以我们要初始化PA2 PA3为串口功能,这样我们就可以直接用st-link抓取打印,而不用再接一个usb转串口的模块。
在这里插入图片描述
在这里插入图片描述
由于要用letter shell,所以要配置串口为tx rx模式,发送数据我们用普通轮询模式,接收数据用中断模式,中断函数每次接收到一个数据调用一次,我们在中断函数里调用 shellHandler(&shell, received_char)去处理数据即可。

a、串口时钟初始化

所有时钟的初始化,都放在了clock_init.c中的
void BOARD_ClockInit函数中
在这里插入图片描述

b、gpio 、usart初始化

// 初始化PA2 PA3作为打印串口使用
static void Board_ConsoleInit(void)
{LL_RCC_ClocksTypeDef rccClock;/* Configure Tx Pin as : Alternate function, High Speed, Push pull, Pull up */LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_2, LL_GPIO_MODE_ALTERNATE);LL_GPIO_SetAFPin_0_7(GPIOA, LL_GPIO_PIN_2, LL_GPIO_AF_7);LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_2, LL_GPIO_SPEED_FREQ_HIGH);LL_GPIO_SetPinOutputType(GPIOA, LL_GPIO_PIN_2, LL_GPIO_OUTPUT_PUSHPULL);LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_2, LL_GPIO_PULL_UP);/* Configure Rx Pin as : Alternate function, High Speed, Push pull, Pull up */LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_3, LL_GPIO_MODE_ALTERNATE);LL_GPIO_SetAFPin_0_7(GPIOA, LL_GPIO_PIN_3, LL_GPIO_AF_7);LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_3, LL_GPIO_SPEED_FREQ_HIGH);LL_GPIO_SetPinOutputType(GPIOA, LL_GPIO_PIN_3, LL_GPIO_OUTPUT_PUSHPULL);LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_3, LL_GPIO_PULL_UP);/* (3) Configure USART functional parameters ********************************//* Disable USART prior modifying configuration registers *//* Note: Commented as corresponding to Reset value */// LL_USART_Disable(USART2);NVIC_SetPriority(USART2_IRQn, 0);  NVIC_EnableIRQ(USART2_IRQn);/* TX/RX direction */LL_USART_SetTransferDirection(USART2, LL_USART_DIRECTION_TX_RX);/* 8 data bit, 1 start bit, 1 stop bit, no parity */LL_USART_ConfigCharacter(USART2, LL_USART_DATAWIDTH_8B, LL_USART_PARITY_NONE, LL_USART_STOPBITS_1);LL_RCC_GetSystemClocksFreq(&rccClock);LL_USART_SetBaudRate(USART2, rccClock.PCLK1_Frequency, LL_USART_OVERSAMPLING_16, 115200); /* Enable RXNE and Error interrupts */LL_USART_EnableIT_RXNE(USART2);LL_USART_EnableIT_ERROR(USART2);/* (4) Enable USART *********************************************************/LL_USART_Enable(USART2);
}

c、中断处理函数

在这里插入图片描述

d、printf重定向

在这里插入图片描述
后面完善letter shell写函数的时候,跟这个类似,直接复制过去就行。

2、letter shell的移植

下载传送门
下载后,将src中所有的文件拷贝到我们的工程中,并新建shell_port.c shell_port.h文件,目录结构如图:
在这里插入图片描述
shell_port.c 中内容如下:
#include “shell_port.h”

#include "shell.h"
#include "shell_port.h"Shell shell;
char shell_buffer[512];short userShellWrite(char *data, unsigned short len)
{uint32_t i;for (i = 0; i < len; i++){while (!LL_USART_IsActiveFlag_TXE(USART2)){}/* If last char to be sent, clear TC flag */if (i == (len - 1)){LL_USART_ClearFlag_TC(USART2); }/* Write character in Transmit Data register.TXE flag is cleared by writing data in DR register */LL_USART_TransmitData8(USART2, data[i]);}return len;
}void User_Shell_Init(void)
{shell.write = userShellWrite;shellInit(&shell, shell_buffer, 512);
}

shell_port.h内容如下:

#ifndef __SHELL_PORT_H__
#define __SHELL_PORT_H__
#include "shell.h"
#include "main.h"extern Shell shell;
void User_Shell_Init(void);
#endif

main函数添加shell的初始化函数
在这里插入图片描述
如果此时编译报错,修改ld文件如下:
在这里插入图片描述

这样开机后,接到letter shell交互界面了。
在这里插入图片描述

3、Letter Shell的使用

我们添加一个命令,来控制LED灯,输入LED On灯亮,输入LED Off灯灭,
输入LED Blink 100,灯开始间隔100ms开始闪烁。
首先在shell_cfg.h使能支持外部命令的宏。
在这里插入图片描述
添加LED命令:

volatile static bool isBlinking = false;
volatile static long delay_time = 250;int LED_Control(int argc,char *argv[])
{if (argc == 2){if (!strncmp(argv[1],"On",2)){isBlinking = false;LED_ON();}else if (!strncmp(argv[1],"Off",3)){isBlinking = false;LED_OFF();}else{printf(" param error.please use LED On/LED Off/LED Blink 200\r\n");return -1;}}else if (argc == 3){if(!strncmp(argv[1],"Blink",5)){delay_time = strtol(argv[2],NULL,10);if (delay_time > 0){isBlinking = true;}else{isBlinking = false;printf("please LED Blink 200 \r\n");LED_OFF();return -1;}}else{printf(" param error.please use LED On/LED Off/LED Blink 200\r\n");return -1;}}else{printf(" param error.please use LED On/LED Off/LED Blink 200\r\n");return -1;}return 0;
}SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), LED, LED_Control, LED_Control);

编译后重新烧录,在串口中输入相关命令,即可控制LED灯,这样调试是不是很方便。
在这里插入图片描述

4 、代码

代码下载


http://www.ppmy.cn/news/412692.html

相关文章

腾讯资深TA:近代游戏技术革新与PCG技术的思考

作者&#xff1a;Freddy腾讯游戏学院专家 技术美术 首先我结合自己所经历的这段短暂的游戏发展历程&#xff0c; 结合PCG技术&#xff0c;来简述一下从小作坊模式到技术变革对游戏工业化发展的影响。从行业技术的发展来看&#xff0c;我国的游戏发展经历了从技术混沌时期&…

公众号历史文章分类汇总

对于公众号读者来说 在公众号找文章是一个挥之不去的痛。 每次想找一个公众号上的某一篇文章&#xff0c;或之前看过后来突然有一天又想起那篇文章&#xff0c;想再次看看&#xff0c;可就是找不到啊。 结果只有翻看历史文章&#xff0c;一直刷来刷去&#xff0c;看的眼花缭乱&…

干货分享 | 2018年,我都做了些什么?

对于公众号读者来说 在公众号找文章是一个挥之不去的痛。 每次想找一个公众号上的某一篇文章&#xff0c;或之前看过后来突然有一天又想起那篇文章&#xff0c;想再次看看&#xff0c;可就是找不到啊。 结果只有翻看历史文章&#xff0c;一直刷来刷去&#xff0c;看的眼花缭乱&…

Python数据分析《黑客帝国》-一切都不是偶然

目录 1、《黑客帝国》背景介绍2、数据爬取3、描述统计分析&#xff08;评价星级&#xff09;4、情感分析分词关键字统计词云关键字分词词云 1、《黑客帝国》背景介绍 每个人的身上都潜藏这完美灵性世界的碎片&#xff0c;他们死后体内的“灵性碎片”便会脱离肉体束缚&#xff…

22部漫威电影大合集和观影顺序

【原文链接】&#xff1a;https://blog.tecchen.xyz &#xff0c;博文同步发布到博客园。 由于精力有限&#xff0c;对文章的更新可能不能及时同步&#xff0c;请点击上面的原文链接访问最新内容。 欢迎访问我的个人网站&#xff1a;https://www.tecchen.xyz 。 北美上映时间先…

第一天学习弹片鸡

/*软件安装包、开发板资料、课件及程序源码百度网盘链接&#xff1a;https://pan.baidu.com/s/1vDTN2o8ffvczzNQGfyjHng 提取码&#xff1a;gdzf&#xff0c;链接里压缩包的解压密码&#xff1a;51 &#xff0c;如果打不开请复制链接到浏览器再打开*/ #1.有些杀毒软件会删文件…

lsl

https://www.neurobs.com/pres_docs/html/03_presentation/06_hardware_interfacing/02_lab_streaming_layer.htm https://github.com/sccn/labstreaminglayer/wiki https://github.com/sccn/labstreaminglayer https://sccn.ucsd.edu/wiki/EEGLAB_and_python

LSP

LSP(分层服务提供程序) LSP就是TCP/IP等协议的接口. LSP一般用于浏览器劫持 修复可以以管理员身份运行cmd 输入netsh winsock reset