[其它应用] 中颖串口案例

[复制链接]
2863|3
 楼主| 小小蚂蚁举千斤 发表于 2023-3-24 10:35 | 显示全部楼层 |阅读模式
功能:使用 UART1 在 PB8/TXD1、PB9/RXD1 上进行串口收发,上位机通过 UART1 连接 SH32F9B00,
上位机发送 1 字节,SH32F9B00 接收后把该字节加 0x33 再反馈给上位机,波特率 9600Bps,8/1/1/none 模
式。
说明:
(1)复用配置时先配置 I/O 口,再开启数字外设功能,如果先开 RXD,有可能外部 I/O 电平变化
导致接收错误起始位。
(2)此例中 RXD1 映射到 PA2 主要为示范 SWJ 接口复用为数字外设接口功能。
(3)RXD1 初始化为输入且内部上拉、TXD1 初始化为输出高电平。

  1. #include <SH32F9B00.H>
  2. char WaitUartTransmit(UART_TypeDef* Uart, unsigned char ch )
  3. {
  4. while(!Uart->FR.BIT.TI); // 等待发送完成
  5. Uart->TDR = ch; // 发送数据,TI 为自动清
  6. }
  7. char WaitUartReceive(UART_TypeDef* Uart)
  8. {
  9. while(!Uart->FR.BIT.RI); // 等待接收完成
  10. Uart->FR.BIT.RIC = 1; // RI 人工清,定义为写 1 清
  11. return(Uart->RDR); // 要求先清 RI,再返回数据,避免阻塞接收
  12. }

  13. void main(void)
  14. {
  15. unsigned char rcv_byte;
  16. RCC_Config(); // 配置使用 PLL 作为系统时钟,HCLK=120MHz,PCLK0=HCLK/4
  17. NVIC_Config(); // 如果需要配置中断,此例未用到中断
  18. GPIO_Config(); // 如果需要配置 I/O,此例保持默认输入悬空
  19. RCC->RCCLOCK = 0x33CC; // unlock RCC config
  20. APB0_CFG->RCCLOCK = 0x33CC; // 解锁 APB0_CFG 寄存器
  21. RCC->AHBENR.BIT.GPIOEN = 1; // 打开 GPIO 模块时钟
  22. RCC->AHBENR.BIT.SYSCFGEN = 1; // 打开 SYSCFG 模块时钟(SWJ 复用)
  23. APB0_CFG->APB0ENR.BIT.UART1EN = 1; // 打开 UART1 时钟
  24. RCC->RCCLOCK = 0x0; // lock RCC config
  25. GPIOB_CFG->LCKR.V32 = 0x5AA50000; // unlock PB config
  26. GPIOB_IOD->MODER |= 0x0100; // set PB8 output
  27. GPIOB_IOD->MODER &= 0xFDFF; // set PB9 input (default)
  28. GPIOB_CFG->PUPDR.BIT.PUPDR9 = 1; // set PB9 pull-up, 01b: pull-up
  29. GPIOB_IOD->ODR |= 0x0100; // set PB8 = 1
  30. SYSCFG->SAFR.V32 = 0x5AA50008; // SWJ 只使用 SWD 接口,释放 PA2 口
  31. GPIOB_CFG->AFRH.BIT.AFR8 = 7; // PB8 映射到 TXD1
  32. GPIOB_CFG->AFRH.BIT.AFR9 = 7; // PB9 映射到 RXD1
  33. GPIOB_CFG->LCKR.V32 = 0x5AA5FFFF; // lock PE config
  34. UART1->BRT.BIT.SBRT = 194; // 设置波特率为 9.6KBps,30M/16/9.6K=195.3125
  35. UART1->BRT.BIT.BFINE = 5; // 0.3125*16=5
  36. UART1->CR.BIT.SM = 1; // type 1: 8/1/1/none, variable baud rate
  37. UART1->CR.BIT.SBRTEN = 1; // enable baud rate generation
  38. UART1->CR.BIT.TEN = 1; // enable txd
  39. UART1->CR.BIT.REN = 1; // enable rxd
  40. while(1) // main loop
  41. {
  42. rcv_byte = WaitUartReceive(UART1); // Uart 接收
  43. WaitUartTransmit(UART1,rcv_byte+0x33); // Uart 发送
  44. }
  45. }




OKAKAKO 发表于 2023-11-12 19:15 | 显示全部楼层
串口配置很关键
szt1993 发表于 2023-11-12 20:35 | 显示全部楼层
复用配置时先配置 I/O 口,再开启数字外设功能
绒兔星球 发表于 2025-8-30 15:00 | 显示全部楼层
中颖串口案例:以 SH79F085 为例,初始化时配置 SCON 寄存器设工作模式(如模式 1),TMOD 设波特率发生器,计算装载值。使能接收中断(REN=1,ES=1),主函数循环发送数据;中断服务程序中判断 RI 标志,读取 SBUF 数据并处理,清除标志。需注意波特率匹配与中断优先级。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

228

主题

2630

帖子

1

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