野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 22720|回复: 3

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

[复制链接]
发表于 2017-2-27 09:22:17 | 显示全部楼层 |阅读模式
3火花
本帖最后由 七月流火 于 2017-2-27 09:26 编辑

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


  1. <font color="#ff0000">irq_temp参数相关</font>
  2. typedef enum{
  3.         COM0,
  4.         COM1,
  5.         COM2,
  6.         COM3,
  7.         COM4,
  8. }ALL_CH;
  9. IRQn_Type irq_temp = UART0_IRQn;
  10. ch = COM2;
  11. irq_temp = UART0_IRQn + ch;
复制代码


  1. <font color="#ff0000">以下为初始化完整代码</font>
  2. /*****************************************************************************
  3. 函 数 名  : UART_init
  4. 功能描述  : 串口 初始化
  5. 输入参数  : unsigned long sysClk   
  6.              unsigned long baudrate  
  7.              入参clk:UART模块工作的系统频率
  8.                          入参baudrate:UART工作的波特率
  9. *****************************************************************************/
  10. void UART_init(unsigned long sysClk, unsigned long baudrate, uint8 ch)//可用
  11. {
  12.     uint16_t divisor;
  13.         LPC_UART_TypeDef *regaddr = NULL;
  14.         LPC_UART1_TypeDef *regaddr1 = NULL;
  15.         LPC_UART4_TypeDef *regaddr4 = NULL;

  16.         IRQn_Type irq_temp = UART0_IRQn;


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

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

  32.                         break;

  33.                 case 2:                        

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

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

  46.                         regaddr = LPC_UART2;

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

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

  54.                         regaddr = LPC_UART3;

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

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

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

  62.                         regaddr4 = LPC_UART4;

  63.                         break;
  64.                 default:
  65.                 break;

  66.         }

  67.         g_uartTxBufferHead[ch] = 0;
  68.         g_uartTxBufferTail[ch] = 0;


  69.         divisor = uartGetDivisorByBaudrate(sysClk, baudrate);

  70.         irq_temp = UART0_IRQn + ch;

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

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

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

  82.                  regaddr4->LCR  = 0x83;               

  83.                  regaddr4->DLM  = ((divisor >> 8) & 0x00FF);
  84.                  regaddr4->DLL  = (divisor & 0x00FF);
  85.                  regaddr4->LCR  = 0x03;        
  86.                  regaddr4->FCR  = 0x87;

  87.                  regaddr4->IER = IER_RBR | IER_THRE | IER_RLS;

  88.                  irq_temp = UART4_IRQn;
  89.          }
  90.         else
  91.         {               
  92.                  regaddr->LCR  = 0x83;

  93.                  regaddr->DLM  = ((divisor >> 8) & 0x00FF);
  94.                  regaddr->DLL  = (divisor & 0x00FF);
  95.                  regaddr->LCR  = 0x03;
  96.                  regaddr->FCR  = 0x87;

  97.                  regaddr->IER = IER_RBR | IER_THRE | IER_RLS;
  98.         }

  99.         if(irq_temp != 0)
  100.         {
  101.                 My_print("%d\r\n",irq_temp);
  102.         }

  103.         NVIC_EnableIRQ(irq_temp);//<font color="#ff0000">串口2初始化在这一步死机</font>

  104.         irq_temp = 0;

  105. }
复制代码


回复

使用道具 举报

发表于 2017-2-27 11:21:33 | 显示全部楼层
帮顶           
回复

使用道具 举报

 楼主| 发表于 2017-2-27 17:00:36 | 显示全部楼层

我已经找到问题所在 请问火哥 如何删帖
回复

使用道具 举报

发表于 2018-6-7 17:37:06 | 显示全部楼层
兄弟这是rtt里的驱动吗?
回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 15:40 , Processed in 0.034405 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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