STM32F072 USART4工作不正常
我的一个项目用到STM32F072CBT6的4个USART, 其中USART1,usart2,usart3都是用DMA方式发送,中断接收,都可以工作了,唯独USART4既不能中断接收,也不能中断发送,发送能检测到TXE标志,但是不能进入中断。TXD接口也检测不到数据输出。下面是USART4的初始化代码和部分原理图void Usart4_Init(void)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// 开启GPIOA时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
// 开启USART4时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART4, ENABLE);
// 配置USART4引脚功能复用
GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_4);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_4);
// 配置 USART Tx and Rx 引脚为推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置 USART4
USART_InitStructure.USART_BaudRate = 2400;
USART_InitStructure.USART_WordLength = USART_WordLength_9b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_Even;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART4, &USART_InitStructure);
// 配置 USART4中断
NVIC_InitStructure.NVIC_IRQChannel = USART3_4_IRQn;// 中断号
NVIC_InitStructure.NVIC_IRQChannelPriority= 0;// 中断优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能中断
NVIC_Init(&NVIC_InitStructure); // 配置中断
USART_ITConfig(USART4, USART_IT_RXNE, ENABLE); // 使能接收中断
USART_Cmd(USART4, ENABLE); // 使能外设
}
发送子程序,发送过程,暂时使用了检测发送标志位判断发送完成,一样没有任何进展
uint8usart4_send[64]; // USART发送缓存
uint8 usart4_send_length; // 发送的数据长度
uint8 usart4_send_count; // 发送数据长度计数器
uint8 Usart4Send(void)
{
uint8 i;
for (i = 0; i < usart4_send_length; i++)
{
USART_SendData(USART4, usart4_send);
while (USART_GetFlagStatus(USART4, USART_FLAG_TXE) == RESET);
}
OSSemPost(usart4_tx_sem); // 发送USART4发送完成信号
}
中断处理,包含usart3的接收部分
void USART3_4_IRQHandler(void)
{
OSIntEnter();
if (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) != RESET)
{ // 接收中断
Usart3Sink(USART_ReceiveData(USART3)); // 存储数据
usart3_finish_delay = 4;
}
if (USART_GetFlagStatus(USART4, USART_FLAG_RXNE) != RESET)
{ // 接收中断
Usart4Sink(USART_ReceiveData(USART4)); // 存储数据
usart4_finish_delay = 8;
}
if (USART_GetFlagStatus(USART4, USART_FLAG_TXE) != RESET)
{ // USART4 发送中断
USART_ClearFlag(USART4, USART_FLAG_TXE); // 发送中断处理
}
if (USART_GetFlagStatus(USART3, USART_FLAG_ORE) != RESET)
{ // 清除溢出中断
USART_ClearFlag(USART3, USART_FLAG_ORE);
USART_ReceiveData(USART3); // 虚拟一次读数据
}
if (USART_GetFlagStatus(USART4, USART_FLAG_ORE) != RESET)
{ // 清除溢出中断
USART_ClearFlag(USART4, USART_FLAG_ORE);
USART_ReceiveData(USART4); // 虚拟一次读数据
}
OSIntExit();
}
由于一直在调试,代码有点乱,应该不影响诸位大侠的判断。
先自己顶一个:) 我用VSCode编辑代码,直接粘贴过来效果比较差,诸位大侠见谅。 这个代码中没有打开发送中断,之前用 USART_ITConfig(USART4, USART_IT_TC, ENABLE)和 USART_ITConfig(USART4, USART_IT_TXE, ENABLE);指令 打开过,依然无法进入接收或发送中断 从代码上看,没有问题。建议在线仿真一下,看一下寄存器IO配置是否正确。可以使用STM32CubeMX生成测试代码测试。 先顶一下,等待大神答案 USART_ITConfig(USART4, USART_IT_TXE, ENABLE);你应该配置这个,发送中断才能使能,如果这个也做了,检查下这个系统的中断优先级分组 问题发现了,犯了一个超级低级的错误。初始化代码没有调用。害的我昨天调试了一个通宵。
谢谢各位的帮助。现在可以进入中断了。 sky_han 发表于 2019-1-8 14:19
USART_ITConfig(USART4, USART_IT_TXE, ENABLE);你应该配置这个,发送中断才能使能,如果这个也做了,检查 ...
STM32F072应该没有中断优先级分组。 安 发表于 2019-1-8 14:09
从代码上看,没有问题。建议在线仿真一下,看一下寄存器IO配置是否正确。可以使用STM32CubeMX生成测试代码 ...
谢谢你的帮助,问题已经解决。超级低级的错误。初始化代码忘记调用
页:
[1]
2