[单片机芯片] 关于CH32V003的串口重映射和SP3232EEN原理图设计调试经验分享

[复制链接]
2120|7
 楼主| lilijin1995 发表于 2023-7-9 15:37 | 显示全部楼层 |阅读模式
本帖最后由 lilijin1995 于 2023-7-11 00:12 编辑

之所以要串口重映射,是因为我发现参考了网上的原理图,把UART的TX和RX接反了,如下图,接收数据流程应该是
RX232->R1IN->R1OUT,但是我这里画反了。
9074364ab6d0313033.png
并且也留意到CH32V003可以重映射PD5可以配置TX或RX,
PD6也是一样。如下图
6722364ab6d71eb561.png

接着我们一起来看一下如何把PD5重映射为URX_,PD6重映射为UTX_;这里参考了该篇帖子:
https://www.makerwitawat.com/%E0%B8%A7%E0%B8%B4%E0%B8%98%E0%B8%B5%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B9%80%E0%B8%9B%E0%B8%A5%E0%B8%B5%E0%B9%88%E0%B8%A2%E0%B8%99-port-tx-%E0%B8%AA%E0%B8%B3%E0%B8%AB%E0%B8%A3%E0%B8%B1%E0%B8%9A-ch32v003j4/
  1. void USART_Printf_Init(uint32_t baudrate)
  2. {
  3.     GPIO_InitTypeDef  GPIO_InitStructure = {0};
  4.     USART_InitTypeDef USART_InitStructure = {0};
  5.     NVIC_InitTypeDef  NVIC_InitStructure = {0};


  6.      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);
  7.      GPIO_PinRemapConfig(GPIO_PartialRemap2_USART1, ENABLE); // กำหนดค่า REMAP TX:PD6, RX:PD5
  8.      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; // กำหนดขา GPIO
  9.      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  10.      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  11.      GPIO_Init(GPIOD, &GPIO_InitStructure);

  12.      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  13.      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  14.      GPIO_Init(GPIOD, &GPIO_InitStructure);

  15.      USART_InitStructure.USART_BaudRate = baudrate;
  16.      USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  17.      USART_InitStructure.USART_StopBits = USART_StopBits_1;
  18.      USART_InitStructure.USART_Parity = USART_Parity_No;
  19.      USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  20.      USART_InitStructure.USART_Mode = USART_Mode_Tx;
  21.      USART_Init(USART1, &USART_InitStructure);
  22.      USART_Cmd(USART1, ENABLE);

  23.     USART_InitStructure.USART_BaudRate = 115200;
  24.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  25.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
  26.     USART_InitStructure.USART_Parity = USART_Parity_No;
  27.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  28.     USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;

  29.     USART_Init(USART1, &USART_InitStructure);
  30.     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

  31.     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  32.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  33.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  34.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  35.     NVIC_Init(&NVIC_InitStructure);;

  36.     USART_Cmd(USART1, ENABLE);}


其实这里跟沁恒官方例程基本一致,不过需要通过GPIO_PinRemapConfig重映射,重映射是 通过AFIO寄存器实现的
7812964ac2bb0873ec.png
AFIO_PCFR1的UART1 映射配置低位(配合 AFIO_PCFR1 寄存器
bit21 USART1REMAP1 使用[21,2])
3319864ac2bf2b914e.png
GPIO_PinRemapConfig 的参数选择;
#define GPIO_PartialRemap2_USART1      ((uint32_t)0x80200000)
同时我调试的时候发现104电容GND虚焊了,因为铺地了,所以需要加热久一点。
最后的,中断请求安排上。
  1. void USART1_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

  2. /*********************************************************************
  3. * @fn      USART1_IRQHandler
  4. *
  5. * [url=home.php?mod=space&uid=247401]@brief[/url]   This function handles USART3 global interrupt request.
  6. *
  7. * [url=home.php?mod=space&uid=266161]@return[/url]  none
  8. */
  9. void USART1_IRQHandler(void)
  10. {
  11.     u8 rxData=0;

  12.     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  13.     {
  14.         rxData=USART_ReceiveData(USART1);

  15.         USART_ClearFlag(USART1, USART_IT_RXNE);

  16.         UartRecStruct.RxBuf[UartRecStruct.RxCounter]=rxData;
  17.         switch(UartRecStruct.RxCounter)
  18.         {
  19.             case 0:
  20.             {
  21.                 if(rxData == 0xAA)
  22.                 {
  23.                     UartRecStruct.RxCounter++;
  24.                 }
  25.             }break;
  26.             case 1:
  27.             {
  28.                 if(rxData == 0x55)
  29.                 {
  30.                     UartRecStruct.RxCounter++;
  31.                 }else
  32.                 {
  33.                     ResetUart(&UartRecStruct);
  34.                 }
  35.             }break;
  36.             case 4:
  37.             {
  38.                 if(rxData == 0x0D)
  39.                 {
  40.                     UartRecStruct.RxCounter++;
  41.                 }else
  42.                 {
  43.                     ResetUart(&UartRecStruct);
  44.                 }
  45.             }break;
  46.             case 5:
  47.             {
  48.                 if(rxData == 0x0A)
  49.                 {
  50.                     UartRecStruct.RxCounter++;
  51.                     UartRecStruct.RxOkFlag=READY;
  52.                     USART_SendData(USART1,rxData);
  53.                 }else
  54.                 {
  55.                     ResetUart(&UartRecStruct);
  56.                 }
  57.             }break;
  58.             default:
  59.             {
  60.                 UartRecStruct.RxCounter++;

  61.             }break;
  62.         }

  63.     }
  64. }



tpgf 发表于 2023-8-5 10:00 | 显示全部楼层
楼主是不是吧接收和发送引脚交换了一下啊
gwsan 发表于 2023-8-5 10:39 | 显示全部楼层
这里不需要对io口进行相关的初始化吗
zljiu 发表于 2023-8-5 17:03 | 显示全部楼层
这两个串口都进行了引脚重映射吗
aoyi 发表于 2023-8-5 17:42 | 显示全部楼层
引脚重映射基本上就是多几句配置 一点也不影响使用
nawu 发表于 2023-8-5 18:22 | 显示全部楼层
楼主的思路不错啊 不用跳线了
tfqi 发表于 2023-8-5 22:07 | 显示全部楼层
gwsan 发表于 2023-8-5 10:39
这里不需要对io口进行相关的初始化吗

你没有仔细看  它的io初始化穿插在串口初始化代码中间了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

165

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部