OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2986|回复: 7

求教大家关于UART4的问题

[复制链接]

2

主题

10

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-3-21
在线时间
4 小时
发表于 2016-4-15 01:05:59 | 显示全部楼层 |阅读模式
1金钱
板子用的是STM32 F103VCT6,使用UCOS III接收串口UART4的数据,但是一旦我在电脑端用串口调试助手发送数据给板子,板子就死机,连一个简单的LED闪烁的任务都不工作了,希望大神能帮我解决下问题,谢谢!感激不尽啊!
贴出初始化代码和串口终端代码

void MODBUS_USART_Init(u32 baud)
{
        GPIO_InitTypeDef GPIO_InitStructure;                                          
        USART_InitTypeDef USART_InitStructure;
                 
        //使能IO时钟                                                                  
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
                                                                                                                                  
        TriggerModbusInt(ENABLE);

        //UART4_TX   PC.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
    GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化PA9

    //UART4_RX          PC.11
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;          
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;;;//浮空输入
    GPIO_Init(GPIOC, &GPIO_InitStructure);  //初始化PA10

        //配置UART4       
        USART_InitStructure.USART_BaudRate = baud;//波特率
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//在帧结尾传输1个停止位
        USART_InitStructure.USART_Parity = USART_Parity_No;//无校验
        USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//发送和接收都使能
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制失能
        USART_Init(MODBUSUSART, &USART_InitStructure);

        //使能接收中断中断
    USART_ITConfig(MODBUSUSART, USART_IT_RXNE, ENABLE);

        //打开USART1
        USART_Cmd(MODBUSUSART, ENABLE);                   //使能串口
        //USART_ClearFlag(USART1, USART_FLAG_TC);
        USART_GetFlagStatus(MODBUSUSART, USART_FLAG_TC);
       
        BSP_IntVectSet(BSP_INT_ID_USART4, BSP_IntHandlerUART4); //设置串口1的中断向量,必须要有的
        BSP_IntEn(BSP_INT_ID_USART4);
}


void TriggerModbusInt(FunctionalState state)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = state;
        NVIC_Init(&NVIC_InitStructure);
}


static void BSP_IntHandlerUART4(void)
{
        u8 RX_dat;

        OSIntEnter();
       
        if (USART_GetITStatus(MODBUSUSART, USART_IT_RXNE) != RESET)   //判断发生接收中断
        {
            //printf("USART Interrupt Successful.");
        USART_ClearITPendingBit(MODBUSUSART,   USART_IT_RXNE);             //清除中断标识
            RX_dat = USART_ReceiveData(MODBUSUSART);// & 0x7F;                      //接收数据,整理除去前两位
          
            SendRcvdMsgToMODBUSRcvTask(RX_dat);
        }

        OSIntExit();       
}



最佳答案

查看完整内容[请看2#楼]

BSP_IntHandlerUART4,不符合规矩。你看.s的定义,就知道了,所有正确的中断服务函数名字,都在.s里面定义了名字的了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-4-15 01:06:00 | 显示全部楼层
BSP_IntHandlerUART4,不符合规矩。你看.s的定义,就知道了,所有正确的中断服务函数名字,都在.s里面定义了名字的了。
回复

使用道具 举报

8

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2015-12-31
在线时间
38 小时
发表于 2016-4-15 08:37:28 | 显示全部楼层
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);这个使能函数第一个参数:RCC_APB1Periph_USART4
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-3-21
在线时间
4 小时
 楼主| 发表于 2016-4-15 10:51:50 | 显示全部楼层
jgh211 发表于 2016-4-15 08:37
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);这个使能函数第一个参数:RCC_APB1Periph_USART4

不是的,是UART4,我看库的。

#define RCC_APB1Periph_USART2            ((uint32_t)0x00020000)
#define RCC_APB1Periph_USART3            ((uint32_t)0x00040000)
#define RCC_APB1Periph_UART4             ((uint32_t)0x00080000)
#define RCC_APB1Periph_UART5             ((uint32_t)0x00100000)
#define RCC_APB1Periph_I2C1              ((uint32_t)0x00200000)
#define RCC_APB1Periph_I2C2              ((uint32_t)0x00400000)

我的串口收数据是没问题的,还有我是放在UCOS III上跑的,之前用UCOS III收串口USART1,2的数据是没问题的。
回复

使用道具 举报

8

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2015-12-31
在线时间
38 小时
发表于 2016-4-15 15:44:06 | 显示全部楼层
lx.xxxxic 发表于 2016-4-15 10:51
不是的,是UART4,我看库的。

#define RCC_APB1Periph_USART2            ((uint32_t)0x00020000)

没用过uart  以为是USART  误导人了= =
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-4-15 22:53:54 | 显示全部楼层
中断服务程序有问题,你这种写法,不对。
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-3-21
在线时间
4 小时
 楼主| 发表于 2016-4-15 23:21:45 | 显示全部楼层
正点原子 发表于 2016-4-15 22:53
中断服务程序有问题,你这种写法,不对。

原子哥,.s文件里面是这么定义的:

                EXPORT  BSP_IntHandlerTIM5            [WEAK]
                EXPORT  BSP_IntHandlerSPI3            [WEAK]
                EXPORT  BSP_IntHandlerUART4           [WEAK]
                EXPORT  BSP_IntHandlerUART5           [WEAK]
                EXPORT  BSP_IntHandlerTIM6            [WEAK]
                EXPORT  BSP_IntHandlerTIM7            [WEAK]

还有我用的是UCOS III的板级支持包,板级支持包写中断的时候回调函数名称无所谓的,因为他是一个函数指针数组存储各个中断的响应函数,所以我们使用的时候只需要注册下回调函数就可以了,所以名称无所谓吧?
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-3-21
在线时间
4 小时
 楼主| 发表于 2016-4-18 16:48:02 | 显示全部楼层
今天这个问题终于弄好了,原来是UCOS的中断服务函数和.s文件里面的函数名不一致导致的!修改过后就没问题了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-16 22:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表