因为要用STM32H743做4个串口的同时通信,查询发送的方式速度太慢了,所以打算采用中断方式进行发送。可是打开发送中断后,程序完全不工作,查了好久,实在是搞不清楚了,哪位高手能否帮帮忙,看看我的串口初始化哪里错了。谢谢了。
程序如下
//串口中断处理
void USART1_IRQHandler(void)
{
if(USART1->ISR&(1<<5)) // 接收到数据
{
u8a_RecvBuf1[u8_RecvBufPoint1]=USART1->RDR; // 将接收数据保存进缓冲区中
u8_RecvBufPoint1++; // 接收缓冲区指针加1
if(u8_RecvBufPoint1>26)
u8_RecvBufPoint1=26; // 最大接收数据是26个字节
u8_CommRecvTime1=3; // 延时3ms进行处理
}
if(USART1->ISR&(1<<6)) // 发送结束中断
{
USART1->ISR&=0<<6; // 清发送中断标志
if(u8_SendNum1)
{
u8_SendNum1--;
USART1->TDR=u8a_SendBuf1[u8_SendBufPoint1++];
}
}
USART1->ICR|=1<<3; //清除溢出错误,否则可能会卡死在串口中断服务函数里面
}
//初始化IO 串口1
//pclk2
CLK2时钟频率(Mhz)
//注意:USART1的时钟,是可以通过RCC_D2CCIP2R选择的
//但是我们一般用默认的选择即可(默认选择rcc_pclk2作为串口1时钟)
//pclk2即APB2的时钟频率,一般为100Mhz
//bound:波特率
void uart_init(u32 pclk2,u32 bound)
{
u32 temp;
temp=(pclk2*1000000+bound/2)/bound; //得到USARTDIV@OVER8=0,采用四舍五入计算
RCC->APB2ENR|=1<<4; //使能串口1时钟
GPIO_Set(GPIOB,PIN14|PIN15,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_MID,GPIO_PUPD_PU);//PB14,PB15,复用功能,上拉输出
GPIO_AF_Set(GPIOB,14,4); //PB14,AF4
GPIO_AF_Set(GPIOB,15,4); //PB15,AF4
//波特率设置
USART1->BRR=temp; //波特率设置@OVER8=0
USART1->CR1=0; //清零CR1寄存器
USART1->CR1|=0<<28; //设置M1=0
USART1->CR1|=0<<12; //设置M0=0&M1=0,选择8位字长
USART1->CR1|=0<<15; //设置OVER8=0,16倍过采样
USART1->CR1|=1<<3; //串口发送使能
USART1->CR1|=1<<2; //串口接收使能
USART1->CR1|=1<<5; //接收缓冲区非空中断使能
USART1->CR1|=1<<6; //发送数据寄存器为空中断使能 当打开这一行,即打开发送中断后,程序就不工作了
MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级
USART1->CR1|=1<<0; //串口使能
}
一周热门 更多>