历史上的今天
今天是:2025年03月25日(星期二)
2019年03月25日 | STM32cube HAL库 UART串口中断方式收发任意长度 调试笔记
2019-03-25 来源:eefocus
STM32Cube对于新项目的开发能节省不少时间,从繁琐芯片初始化中解脱出来
1.STM32 UART初始化部分,配置好工程,采用STM32cube生成代码,初始化即已经完成。
2.串口中断方式的发动作:HAL_UART_Transmit_IT
没做任何处理的情况下,我们在程序中使用printf会把信息打印到显示屏中去,这时我们需要将printf重定向就能将printf的消息打印到串口中 去。在主函数中添加如下函数:
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit_IT(&huart1, (uint8_t *)&ch, 1);
osDelay(1);
return 0;
}
//即完成重定向,执行printf即能将任意长度的字符发送到串口中。
3.串口中断的收动作:HAL_UART_Receive_IT
HAL_UART_Receive_IT(&huart1,(uint8_t *)&value,1);//程序不会在这个语句停留,直接会按照中断方式把接收数据存放在value中,但是这个语句只能使能一次串口中断。所以要在中断服务函数或者回调函数中重新使能
代码:
//接收缓存初始化
#define MAX_RECV_LEN 1024
uint8_t msg_buff[MAX_RECV_LEN] = {0};
uint8_t * msg = msg_buff;
static int flag = false;
//接收中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
uint8_t ret = HAL_OK;
msg++;
if( msg == msg_buff + MAX_RECV_LEN)
{
msg = msg_buff;
}
do
{
ret = HAL_UART_Receive_IT(UartHandle,(uint8_t *)msg,1);
}while(ret != HAL_OK);
if(*(msg-1) == '\n') //接收以\n为结尾字符,则表示接收完成
{
flag = true;
}
}
void uart_main(void)
{
extern UART_HandleTypeDef huart1;
HAL_UART_Receive_IT(&huart1, (uint8_t *)msg, 1); //开启第一次中断
while(1)
{
if (flag == true)
{
printf("msg_buff = %s\r\n",msg_buff);
memset(msg_buff, 0, sizeof(msg_buff)); //清空缓存区
// 指向接收缓存的头部
msg = msg_buff;
(&huart1)->pRxBuffPtr = msg;
flag = false;
}
osDelay(10);
}
}
史海拾趣
|
前段时间买了2440开发板也没怎么搞,惭愧:$ 最近没啥其它事情就好好啃啃吧,哎……没什么基础啊,先欣赏下别人的东西吧 【mini2440开发板实现国际象棋人机对弈 】 我在机子上跑了一下,好像不太能跟电脑对弈啊,不知道哪个地方还有问题 ...… 查看全部问答> |
|
VC如何发彩信,已经实现ATDT*99***1#这一步了,下一步应该是什么,内容打包?如果打包? VC如何发彩信,已经实现ATDT*99***1#这一步了,下一步应该是什么,内容打包?如果打包? ATE AT+CMGF=0 AT+CIMI AT+CIMI获得IMSI IMSI 国际移动用户识别码(IMSI) international mobile subscriber identity 国际上为唯一识别 ...… 查看全部问答> |
|
/*进行SAA7121H的初始化*/ GPIO_RSET(GPVAL,0x0); addrI2C = 0xB8 >>1; /*选择第0路的I2C的地址*/ /*将第0路的视频输入口的数据口设为高阻状态, 使能SCLK,将第27脚设为输入*/ _IIC_write(hSeeddm642i2 ...… 查看全部问答> |
|
问题是这样的:我用flash烧写了一个控制电机的程序,不能运行,就把代码改了一下,再进行烧程序的时候就烧不进去啦,我也没有动“lock”和密码(在flash烧写的时候一直很小心的),怎么会锁住呢?很是不解。请EEWORLD老师和各位高手解答一下,谢谢 ...… 查看全部问答> |
|
各位高手,小弟近日在学习关于修改BSP的内容,有一种想法,设置多个引导行,然后在系统启动时按照需要选择相应的引导顺序,然后将config.h中的引导行 #define DEFAULT_BOOT_LINE \\ \"fd=0,0(0,0)host:/fd0/vxWorks.st h=90.0.0.3 e=90.0.0.50 u=ta ...… 查看全部问答> |
|
我是一个只有初中毕业没有读过多少书的人从小就爱好无线电记得很小的时候当通讯兵的父亲带回来几本电子方面的书籍从此就迷上了无线电那种痴迷程度决不亚于现在的小孩迷恋游戏机至今仍然清楚的记得曾经因为装成功一台6管收音机而兴奋的几天几夜没睡 ...… 查看全部问答> |




