硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3253|回复: 3
收起左侧

[客户分享] CX32L003 UART0中断收发寄存器操作

[复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2021-8-24 10:11:27 | 显示全部楼层 |阅读模式
本帖最后由 hejun96 于 2021-8-24 10:25 编辑
  1. static void uart0Config(void)//串口初始化
  2. {               
  3.         //USART0
  4. #if 0
  5.         ///RCC_UART0_CLK_ENABLE;
  6.         RCC_UART0_GPIO_ENABLE;
  7.         /*
  8.         //PA1 - UART0 RX,PA2 - UART0 TX
  9.         GPIOA->AFR &= 0XFFFFF00F;//
  10.         GPIOA->AFR |= 0X00000550;
  11.         */
  12.         
  13.         GPIO_InitTypeDef GPIO_InitStruct = {0};

  14.     /**if UARTx is UART0
  15.                 GPIO Configuration:   
  16.     PA1     ------> UART0_RXD
  17.     PA2     ------> UART0_TXD
  18.     */
  19.         
  20.     GPIO_InitStruct.Pin = UART_MODULE_RX_PIN;
  21.     GPIO_InitStruct.Mode = GPIO_MODE_AF;
  22.         GPIO_InitStruct.OpenDrain = GPIO_PUSHPULL;        
  23.         GPIO_InitStruct.Debounce.Enable = GPIO_DEBOUNCE_DISABLE;
  24.         GPIO_InitStruct.SlewRate = GPIO_SLEW_RATE_HIGH;
  25.         GPIO_InitStruct.DrvStrength = GPIO_DRV_STRENGTH_HIGH;
  26.         GPIO_InitStruct.Pull = GPIO_PULLUP;
  27.         GPIO_InitStruct.Alternate = UART_MODULE_RX_AF;
  28.     HAL_GPIO_Init(UART_MODULE_PORT, &GPIO_InitStruct);
  29.                
  30.     GPIO_InitStruct.Pin = UART_MODULE_TX_PIN;
  31.     GPIO_InitStruct.Mode = GPIO_MODE_AF;
  32.         GPIO_InitStruct.Alternate = UART_MODULE_TX_AF;
  33.     HAL_GPIO_Init(UART_MODULE_PORT, &GPIO_InitStruct);

  34. /*
  35.         UART_HandleTypeDef Uart0InitStructure;
  36.         Uart0InitStructure.Instance = UART_MODULE; // UART0
  37.         Uart0InitStructure.Init.BaudRate = baudrate; // 波特率
  38.         Uart0InitStructure.Init.BaudDouble = UART_BAUDDOUBLE_DISABLE;// 双波特率禁用
  39.         Uart0InitStructure.Init.WordLength = UART_WORDLENGTH_8B; //数据长度
  40.         Uart0InitStructure.Init.Parity = UART_PARITY_NONE; // 无校验
  41.         Uart0InitStructure.Init.Mode = UART_MODE_TX_RX; // 接收和发送使能
  42.         HAL_UART_Init(&Uart0InitStructure);
  43.         
  44.         __HAL_UART_ENABLE_IT(&Uart0InitStructure, UART_IT_RXNE);
  45. #if UART_TX_MODE == UART_TX_MODE_TI
  46.         __HAL_UART_ENABLE_IT(&Uart0InitStructure, UART_IT_TC);
  47. #endif
  48.         HAL_NVIC_EnableIRQ(UART_MODULE_IRQN); // 中断使能
  49. */
  50. #endif
  51. #if 1
  52.         RCC->HCLKEN |= (1 << 0);//使能RCC_GPIOA
  53.         
  54.         GPIOA->OTYPER &= ~(1 << 2);//PA2推挽输出 UART0_TX_PIN
  55.         GPIOA->SLEWCR &= ~(1 << 2);//PA2高电压转换速率
  56.         GPIOA->DRVCR &= ~(1 << 2);//PA2高驱动强度
  57.         GPIOA->PUPDR |= (1 << 4);//带上拉
  58.         GPIOA->AFR |= (5 << 8);//复用为UART0_TX
  59.         
  60.         GPIOA->OTYPER &= ~(1 << 1);//PA1推挽输出 UART0_RX_PIN
  61.         GPIOA->SLEWCR &= ~(1 << 1);//PA1高电压转换速率
  62.         GPIOA->DRVCR &= ~(1 << 1);//PA1高驱动强度
  63.         GPIOA->PUPDR |= (1 << 2);//带上拉
  64.         GPIOA->AFR |= (5 << 4);//复用为UART0_RX


  65.         RCC->PCLKEN |= (1 << 0);//enable uart0 clk
  66.         
  67.         UART0->SCON &= ~(1 << 9);//单倍波特率
  68.         UART0->SCON &= ~(1 << 8);//接收错误帧中断禁止
  69.         UART0->SCON |= (1 << 6);//工作模式1
  70.         UART0->SCON &= ~(1 << 5);//多机通讯禁止
  71.         UART0->SCON |= (1 << 4);//发送/接收使能
  72.         
  73.         UART0->BAUDCR |= (1 << 16);//波特率自动生成
  74.         UART0->BAUDCR |= 0x4D;//约为9600 baudrate = (DBAUD + 1)*fpclk /(32 * (BRG[15:0]+1))
  75.         
  76.         
  77.         NVIC->ISER[0] |= (1 << 6);//UART0_IRQn = 6;
  78.         NVIC->IP[1] |= (2 << 22);//中断 6 的优先级参数再IRP1的寄存器里面[23:22]
  79.         
  80.         UART0->SCON |= (3 << 0);//发送和接收完成 中断使能
  81. #endif
  82. }

  83. //在UART0的中断服务函数里面调用该函数
  84. static void uart0_interrupt(void)
  85. {
  86.         static unsigned char ucUsart0RecData;
  87.         unsigned char usart0_temp_sr = UART0->INTSR;
  88.         
  89.         //关闭接收中断
  90.         ///USART1->CTRL1 &= ~(0X01 << 5);
  91.         /*
  92.         if(usart0_temp_sr & UART_FLAG_FE)
  93.         {
  94.                 usart0_temp_sr = UART0->SBUF;
  95.         }
  96.         else if(usart0_temp_sr & UART_FLAG_RXNE)
  97.         {
  98.                 ucUsart0RecData = UART0->SBUF;
  99.                 app_uart0_recv_byte(ucUsart0RecData);
  100.         }
  101.         else
  102.         {
  103.                 //clear interrupt
  104.                 usart0_temp_sr = UART0->SBUF;
  105.         }
  106.         */
  107.         if(UART0->INTSR & UART_FLAG_RXNE)
  108.         {
  109.                 UART0->INTCLR |= UART_FLAG_RXNE;
  110.                
  111.                 ucUsart0RecData = UART0->SBUF;
  112.                 uart_receive_input(ucUsart0RecData);///app_uart1_recv_byte(ucUsart0RecData);
  113.         }
  114.         
  115. #if UART_TX_MODE == UART_TX_MODE_TI//该宏定义成立
  116.         if(UART0->INTSR & UART_FLAG_TC)
  117.         {
  118.                 UART0->INTCLR |= UART_FLAG_TC;
  119.                 uart0TcFlag = 1;
  120.         }        
  121.         
  122. #endif
  123.         
  124. }
复制代码

此处使用的是CX32L003 的PA1(UART0_RX) 和PA2(UART0_TX)
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115726
QQ
发表于 2021-8-25 09:42:49 | 显示全部楼层
串口的配置不建议用寄存器方式,就用你提供的库方式就挺好,其他人修改略麻烦,不方便移植。

回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2021-8-25 09:49:10 | 显示全部楼层
eric2013 发表于 2021-8-25 09:42
串口的配置不建议用寄存器方式,就用你提供的库方式就挺好,其他人修改略麻烦,不方便移植。

用寄存器方式是考虑到后面会使用IAP升级,那flash就要划分地址保存app1和app2的bin文件,用HAL库太耗空间,所以想减少点flash空间
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115726
QQ
发表于 2021-8-25 10:23:51 | 显示全部楼层
hejun96 发表于 2021-8-25 09:49
用寄存器方式是考虑到后面会使用IAP升级,那flash就要划分地址保存app1和app2的bin文件,用HAL库太耗空间 ...

开启优化后,多出的这点flash可以忽略,非常小。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-14 15:18 , Processed in 0.233003 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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