Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
STM32F429+RTT串口2无法进入中断
发布于 2020-11-21 14:36:17 浏览:1417
订阅该版
我使用了STM32F429IGT6的板子,然后跑了RT-Thread操作系统,单纯一个串口2加定时器3,然后发现无法进入中断,放在正点原子的历程中,同样的代码,正点原子是可以串口助手发送数据到板子上,然后通过打印,将串口助手发送的数据打印到串口助手的显示框上。就是加了RT-Thread就不行了,求助!!希望各位大佬帮帮忙,谢谢! ```c #include "drv_usart2.h" #include "drv_tim3.h" #include "sys.h" #include "stdarg.h" #include "stdio.h" #include "string.h" #include "board.h" #include "drv_led.h" UART_HandleTypeDef UART2_Handler;//UART句柄 //初始化IO 串口2 //bound:波特率 void drv_usart2_init(u32 bound) { GPIO_InitTypeDef GPIO_Initure; __HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟 __HAL_RCC_USART2_CLK_ENABLE(); //使能USART2时钟 //GPIO端口设置 GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3; //PA2、PA3 GPIO_Initure.Mode=GPIO_MODE_AF_PP;//复用推挽输出 GPIO_Initure.Pull=GPIO_PULLUP; //上拉 GPIO_Initure.Speed=GPIO_SPEED_FAST;//高速 GPIO_Initure.Alternate=GPIO_AF7_USART2; //复用为USART2 HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA2\PA3 //UART 初始化设置 UART2_Handler.Instance=USART2; //USART2 UART2_Handler.Init.BaudRate=bound; //波特率 UART2_Handler.Init.WordLength=UART_WORDLENGTH_8B; //字长为8位数据格式 UART2_Handler.Init.StopBits=UART_STOPBITS_1; //一个停止位 UART2_Handler.Init.Parity=UART_PARITY_NONE; //无奇偶校验位 UART2_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; //无硬件流控 UART2_Handler.Init.Mode=UART_MODE_TX_RX; //收发模式 HAL_UART_Init(&UART2_Handler); //使能 __HAL_UART_ENABLE_IT(&UART2_Handler,UART_IT_RXNE);//开启接收中断 HAL_NVIC_EnableIRQ(USART2_IRQn); //使能USART2中断通道 HAL_NVIC_SetPriority(USART2_IRQn,1,0); //抢占优先级1,子优先级0 drv_tim3_init(1000-1,8400-1); //100ms中断 __HAL_TIM_DISABLE(&TIM3_Handler);//关闭定时器3 USART2_RX_STA=0; //清零 } //串口发送缓存区 __align(8) u8 USART2_TX_BUF[USART2_MAX_SEND_LEN]; //发送缓冲,最大USART2_MAX_SEND_LEN字节 #ifdef USART2_RX_EN //如果使能了接收 //串口接收缓存区 u8 USART2_RX_BUF[USART2_MAX_RECV_LEN]; //接收缓冲,最大USART2_MAX_RECV_LEN个字节. //通过判断接收连续2个字符之间的时间差不大于100ms来决定是不是一次连续的数据. //如果2个字符接收间隔超过100ms,则认为不是1次连续数据.也就是超过100ms没有接收到 //任何数据,则表示此次接收完毕. //接收到的数据状态 //[15]:0,没有接收到数据;1,接收到了一批数据. //[14:0]:接收到的数据长度 u16 USART2_RX_STA=0; void USART2_IRQHandler(void) { u8 Res; if((__HAL_UART_GET_FLAG(&UART2_Handler,UART_FLAG_RXNE)!=RESET))//接收到数据 { HAL_UART_Receive(&UART2_Handler,&Res,1,1000); if((USART2_RX_STA&0x8000)==0)//接收完的一批数据,还没有被处理,则不再接收其他数据 { if(USART2_RX_STA
SR&0X40)==0);//循环发送,直到发送完毕 USART2->DR=USART2_TX_BUF[j]; } } #include "drv_tim3.h" extern u16 USART2_RX_STA; TIM_HandleTypeDef TIM3_Handler; //定时器句柄 //通用定时器3中断初始化 //arr:自动重装值。 //psc:时钟预分频数 //定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us. //Ft=定时器工作频率,单位:Mhz //这里使用的是定时器3!(定时器3挂在APB1上,时钟为HCLK/2) void drv_tim3_init(u16 arr,u16 psc) { __HAL_RCC_TIM3_CLK_ENABLE(); //使能TIM3时钟 TIM3_Handler.Instance=TIM3; //通用定时器3 TIM3_Handler.Init.Prescaler=psc; //分频系数 TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器 TIM3_Handler.Init.Period=arr; //自动装载值 TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子 HAL_TIM_Base_Init(&TIM3_Handler); HAL_NVIC_SetPriority(TIM3_IRQn,1,3); //设置中断优先级,抢占优先级1,子优先级3 HAL_NVIC_EnableIRQ(TIM3_IRQn); //开启ITM3中断 HAL_TIM_Base_Start_IT(&TIM3_Handler); //使能定时器3和定时器3更新中断:TIM_IT_UPDATE } //定时器3中断服务函数 void TIM3_IRQHandler(void) { if(__HAL_TIM_GET_FLAG(&TIM3_Handler, TIM_FLAG_UPDATE) != RESET) { if(__HAL_TIM_GET_IT_SOURCE(&TIM3_Handler, TIM_IT_UPDATE) !=RESET) { __HAL_TIM_CLEAR_IT(&TIM3_Handler, TIM_IT_UPDATE); USART2_RX_STA|=1<<15; //标记接收完成 __HAL_TIM_DISABLE(&TIM3_Handler);//关闭定时器3 } } } u8 len; u16 times=0; //===========================主函数=========================== //main函数启动之前,rt-thread系统初始化已经在$Sub$$main运行 int main(void) { //------------所有初始化都通过INIT_BOARD_EXPORT导入链表中 drv_usart2_init(57600); rt_kprintf("初始化完成!\r\n"); while(1) { if(USART2_RX_STA&0x8000) { len=USART2_RX_STA&0x3fff;//得到此次接收到的数据长度 u2_printf("\r\n您发送的消息为:\r\n"); HAL_UART_Transmit(&UART2_Handler,(uint8_t*)USART2_RX_BUF,len,1000); //发送接收到的数据 while(__HAL_UART_GET_FLAG(&UART2_Handler,UART_FLAG_TC)!=SET); //等待发送结束 u2_printf("\r\n\r\n");//插入换行 USART2_RX_STA=0; }else { times++; if(times%5000==0) { u2_printf("\r\nALIENTEK 阿波罗STM32F429开发板 串口实验\r\n"); u2_printf("正点原子@ALIENTEK\r\n\r\n\r\n"); } if(times%200==0)u2_printf("请输入数据,以回车键结束\r\n"); if(times%30==0){;}//闪烁LED,提示系统正在运行. rt_thread_mdelay(10); } } return RT_EOK; //返回状态值:1 } ```
查看更多
3
个回答
默认排序
按发布时间排序
yushigengyu
认证专家
2020-11-21
这家伙很懒,什么也没写!
是不是没用cube配置msp文件。要初始化相应的串口引脚
shzn
2020-11-21
这家伙很懒,什么也没写!
这个是我从正点原子的指纹识别历程上面移植上去的,相当于自己添加的,没有使用RTT自带的。
whj467467222
认证专家
2020-11-21
开源,分享,交流,共同进步
怀疑时钟没开
撰写答案
登录
注册新账号
关注者
0
被浏览
1.4k
关于作者
shzn
这家伙很懒,什么也没写!
提问
1
回答
1
被采纳
0
关注TA
发私信
相关问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
如何在master上的BSP中添加配置yml文件
2
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
3
RT-Thread 发布 EtherKit开源以太网硬件!
4
rt-thread使用cherryusb实现虚拟串口
5
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部