学习初衷: 不仅仅为了比赛!
目录
一、问题引入
二、UART常用的三种工作模式
1.UART工作在中断模式
2.UART工作在DMA模式下
3.uart工作在接收转空闲的模式下
三、获取指令中需要的数据
四、printf函数的实现
一、问题引入
问题引入:请看下面这样一个设计要求
这个时候, 是不是使用一下的这种配置方法就不得行了
/* 主函数初始化 */
Uart_Init();
/* 接收中断, 该函数的最后一个参数指定接收到对应的字符数后才触发中断 */
HAL_UART_Receive_IT(&huart1, uart_recv_buff, 7);
/* uart接收完成ISR */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1) {
printf("recv: 111111\r\n");
memset(uart_recv_buff, 0 , sizeof(uart_recv_buff));
HAL_UART_Receive_IT(&huart1, uart_recv_buff, 5);
}
}
以上的配置方法只适合接收的字符数量确定的情况, 对于文章开头描述的问题并不能完成要求。
二、UART常用的三种工作模式
1.UART工作在中断模式
也就是上述所描述的那种情况, 给大家配置一下, 将就我也再加深一下印象。
不去配置指定的引脚的化, 再uart的参数配置这里配置好后的USART1的默认引脚不是PA9和PA10, 这个坑大家注意一下。
接着就可以生成代码。在过程种大家在初始化函数的地方调用生成好的的uart的初始化函数,接着在调用uart接收并产生中断的哪一个函数, 注意点就是该函数必须接收到指定的字符数才产生中断
/* 主函数初始化 */
Uart_Init();
/* 接收中断, 该函数的最后一个参数指定接收到对应的字符数后才触发中断 */
HAL_UART_Receive_IT(&huart1, uart_recv_buff, 7);
/* uart接收完成ISR */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1) {
printf("recv: 111111\r\n");
memset(uart_recv_buff, 0 , sizeof(uart_recv_buff));
HAL_UART_Receive_IT(&huart1, uart_recv_buff, 5);
}
}
2.UART工作在DMA模式下
配置和上述一样, uart的基本参数, 接着需要配置一下DMA
生成代码的代码编写如下, 和uart的接收中断模式一样
3.uart工作在接收转空闲的模式下
上述函数可能不太常用, 该函数的位置
上述中断回调函数的位置
如此, 就能接收不定长的指令了
三、获取指令中需要的数据
给大家说一些C库函数, 大家不会的学一下, 很有用。
sprintf
snprintf
sscanf()
strtok
strchr
strstr
就可以将接收到的数据, 给轻松的解析出来, 剩下的就是逻辑处理的工作了
四、printf函数的实现
调试程序非常有用, 建议大家比赛的时候配置上, 简单讲一下用处。
在函数中打印信息, 查看函数的调用情况
打印变量的值, 在逻辑不清楚的时候, 打印变量的值可以很快的帮助我们解决问题
在过程中任意的位置实现fputc函数
int fputc(int ch, FILE *fp)
{
/* 当串口的发送数据寄存器不空的时候等待 */
while((USART1->ISR & (1 << 7)) == 0);
UASRT1->TDR = ch;
return ch;
}
好了, 就分享这么多, 希望需要帮助的人看了能有思路,不在疑惑!