OpenEdv-开源电子网

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

STM32F107 串口2 初始化过程 中断使能死机

[复制链接]

1

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-4-11
在线时间
8 小时
发表于 2017-2-27 09:17:29 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 流火七月 于 2017-2-27 17:10 编辑

主控芯片:LPC1778
串口:usart2
485芯片:max13487e
问题:与其他硬件控制板通信,同时上电启动,在USART2初始化之时,会死在NVIC_EnableIRQ(irq_temp);这一步

irq_temp参数相关
typedef enum{
        COM0,
        COM1,
        COM2,
        COM3,
        COM4,
}ALL_CH;
IRQn_Type irq_temp = UART0_IRQn;
ch = COM2;
irq_temp = UART0_IRQn + ch;

以下为初始化完整代码
/*****************************************************************************
函 数 名  : UART_init
功能描述  : 串口 初始化
输入参数  : unsigned long sysClk   
             unsigned long baudrate  
             入参clk:UART模块工作的系统频率
                         入参baudrate:UART工作的波特率
*****************************************************************************/
void UART_init(unsigned long sysClk, unsigned long baudrate, uint8 ch)//可用
{
    uint16_t divisor;
        LPC_UART_TypeDef *regaddr = NULL;
        LPC_UART1_TypeDef *regaddr1 = NULL;
        LPC_UART4_TypeDef *regaddr4 = NULL;

        IRQn_Type irq_temp = UART0_IRQn;


        switch(ch)
        {
                case 0:                        
                        LPC_IOCON->P0_2 &= 0xFFFFFFF8;
                        LPC_IOCON->P0_2 |= 0x00000001;                           /* Pin P0.2 used as TXD0 (Com0) */
                        LPC_IOCON->P0_3 &= 0xFFFFFFF8;
                        LPC_IOCON->P0_3 |= 0x00000001;                           /* Pin P0.3 used as RXD0 (Com0) */
                        regaddr = LPC_UART0;

                        break;
                case 1:                        
                        LPC_IOCON->P2_0 &= 0xFFFFFFF8;
                    LPC_IOCON->P2_0 |= 0x00000002;             /* Pin P2.0 used as TXD1 (UART1) */
                    LPC_IOCON->P2_1 &= 0xFFFFFFF8;
                    LPC_IOCON->P2_1 |= 0x00000002;             /* Pin P2.1 used as RXD1 (UART1) */
                        regaddr1 = LPC_UART1;

                        break;

                case 2:                        

                        LPC_SC->PCONP |= ((uint32_t)(1<<24));

                        #if 0//开发板使用引脚
                        LPC_IOCON->P0_10 &= 0xFFFFFFF8;
                        LPC_IOCON->P0_10 |= 0x00000001;                         /* Pin P0.10 used as TXD2 (Com0) */
                        LPC_IOCON->P0_11 &= 0xFFFFFFF8;
                        LPC_IOCON->P0_11 |= 0x00000001;                         /* Pin P0.11 used as RXD2 (Com0) */
                        #else//监控板使用引脚
                        LPC_IOCON->P2_8 &= 0xFFFFFFF8;
                        LPC_IOCON->P2_8 |= 0x00000002;                           /* Pin P2.8 used as TXD2 (Com0) */
                        LPC_IOCON->P2_9 &= 0xFFFFFFF8;
                        LPC_IOCON->P2_9 |= 0x00000002;                           /* Pin P2.9 used as RXD2 (Com0) */
                        #endif

                        regaddr = LPC_UART2;

                        break;
                case 3:                        
                        LPC_SC->PCONP |= ((uint32_t)(1<<25));

                    LPC_IOCON->P0_2 &= 0xFFFFFFF8;
                    LPC_IOCON->P0_2 |= 0x00000002;             /* Pin P0.2 used as TXD0 (Com0) */
                    LPC_IOCON->P0_3 &= 0xFFFFFFF8;
                    LPC_IOCON->P0_3 |= 0x00000002;             /* Pin P0.3 used as RXD0 (Com0) */

                        regaddr = LPC_UART3;

                        break;
                case 4:                        
                        LPC_SC->PCONP |= ((uint32_t)(1<<8));//复位时被禁用

                    LPC_IOCON->P5_4 &= 0xFFFFFFF8;
                    LPC_IOCON->P5_4 |= 0x00000004;             /* Pin P5.4 used as TXD0 (Com0) */

                    LPC_IOCON->P5_3 &= 0xFFFFFFF8;
                    LPC_IOCON->P5_3 |= 0x00000004;             /* Pin P5.3 used as RXD0 (Com0) */

                        regaddr4 = LPC_UART4;

                        break;
                default:
                break;

        }

        g_uartTxBufferHead[ch] = 0;
        g_uartTxBufferTail[ch] = 0;


        divisor = uartGetDivisorByBaudrate(sysClk, baudrate);

        irq_temp = UART0_IRQn + ch;

         if( ch == COM1)//023和1和4的结构体是不一样的
         {               
                 regaddr1->LCR  = 0x83;//允许设置波特率

                 regaddr1->DLM  = ((divisor >> 8) & 0x00FF);
                 regaddr1->DLL  = (divisor & 0x00FF);
                 regaddr1->LCR  = 0x03; //锁定波特率
                 regaddr1->FCR  = 0x87;//RX FIFO在收到1个字节时产生中断

                 regaddr1->IER = IER_RBR | IER_THRE | IER_RLS;//配置中断
         }
         else if( ch == COM4)
         {

                 regaddr4->LCR  = 0x83;               

                 regaddr4->DLM  = ((divisor >> 8) & 0x00FF);
                 regaddr4->DLL  = (divisor & 0x00FF);
                 regaddr4->LCR  = 0x03;        
                 regaddr4->FCR  = 0x87;

                 regaddr4->IER = IER_RBR | IER_THRE | IER_RLS;

                 irq_temp = UART4_IRQn;
         }
        else
        {               
                 regaddr->LCR  = 0x83;

                 regaddr->DLM  = ((divisor >> 8) & 0x00FF);
                 regaddr->DLL  = (divisor & 0x00FF);
                 regaddr->LCR  = 0x03;
                 regaddr->FCR  = 0x87;

                 regaddr->IER = IER_RBR | IER_THRE | IER_RLS;
        }

        if(irq_temp != 0)
        {
                My_print("%d\r\n",irq_temp);
        }

        NVIC_EnableIRQ(irq_temp);//串口2初始化在这一步死机

        irq_temp = 0;

}






正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
587
金钱
587
注册时间
2015-1-9
在线时间
80 小时
发表于 2017-2-27 09:21:46 | 显示全部楼层
你这个库不是标准库吧,是新的HAL库?完全不熟悉。你是怎么确定初始化死在这一步呢?就算初始化不成功大不了串口二不能用,为何会死机?难道读了禁止访问的区域。。。。
君子性非异也,善假于物也
不知常,妄作,凶
纵浪大化中,不喜亦不惧,应尽便须尽,无复独多虑
路漫漫其修远兮,吾将上下而求索
菩萨畏因,凡夫畏果
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-4-11
在线时间
8 小时
 楼主| 发表于 2017-2-27 09:24:50 | 显示全部楼层
XUZJWWSZ 发表于 2017-2-27 09:21
你这个库不是标准库吧,是新的HAL库?完全不熟悉。你是怎么确定初始化死在这一步呢?就算初始化不成功大不 ...

抱歉抱歉 最近在做两个项目 脑子混了 这是另外一个项目的 不是stm32的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-23 19:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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