STM32F429+RTT串口2无法进入中断

发布于 2020-11-21 14:36:17

我使用了STM32F429IGT6的板子,然后跑了RT-Thread操作系统,单纯一个串口2加定时器3,然后发现无法进入中断,放在正点原子的历程中,同样的代码,正点原子是可以串口助手发送数据到板子上,然后通过打印,将串口助手发送的数据打印到串口助手的显示框上。就是加了RT-Thread就不行了,求助!!希望各位大佬帮帮忙,谢谢!

#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<USART2_MAX_RECV_LEN)        //还可以接收数据
            {
                __HAL_TIM_SET_COUNTER(&TIM3_Handler,0);//计数器清空                         
                if(USART2_RX_STA==0)        
                    __HAL_TIM_ENABLE(&TIM3_Handler);  //使能定时器3 
                USART2_RX_BUF[USART2_RX_STA++]=Res;        //记录接收到的值     
            }else 
            {
                USART2_RX_STA|=1<<15;                    //强制标记接收完成
            } 
        }      
  }                                         
}  
#endif
//串口2,printf 函数
//确保一次发送数据不超过USART2_MAX_SEND_LEN字节
void u2_printf(char* fmt,...)  
{  
    u16 i,j;
    va_list ap;
    va_start(ap,fmt);
    vsprintf((char*)USART2_TX_BUF,fmt,ap);
    va_end(ap);
    i=strlen((const char*)USART2_TX_BUF);//此次发送数据的长度
    for(j=0;j<i;j++)//循环发送数据
    {
        while((USART2->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
}

查看更多

关注者
0
被浏览
54
3 个回答
yushigengyu
yushigengyu 认证专家 2020-11-21

是不是没用cube配置msp文件。要初始化相应的串口引脚

shzn
shzn 2020-11-21

这个是我从正点原子的指纹识别历程上面移植上去的,相当于自己添加的,没有使用RTT自带的。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览