功能:使用 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 初始化为输出高电平。 
 
- #include <SH32F9B00.H>
 
 - char WaitUartTransmit(UART_TypeDef* Uart, unsigned char ch )
 
 - {
 
 - while(!Uart->FR.BIT.TI); // 等待发送完成
 
 - Uart->TDR = ch; // 发送数据,TI 为自动清
 
 - }
 
 - char WaitUartReceive(UART_TypeDef* Uart)
 
 - {
 
 - while(!Uart->FR.BIT.RI); // 等待接收完成
 
 - Uart->FR.BIT.RIC = 1; // RI 人工清,定义为写 1 清
 
 - return(Uart->RDR); // 要求先清 RI,再返回数据,避免阻塞接收
 
 - }
 
  
- void main(void)
 
 - {
 
 - unsigned char rcv_byte;
 
 - RCC_Config(); // 配置使用 PLL 作为系统时钟,HCLK=120MHz,PCLK0=HCLK/4
 
 - NVIC_Config(); // 如果需要配置中断,此例未用到中断
 
 - GPIO_Config(); // 如果需要配置 I/O,此例保持默认输入悬空
 
 - RCC->RCCLOCK = 0x33CC; // unlock RCC config
 
 - APB0_CFG->RCCLOCK = 0x33CC; // 解锁 APB0_CFG 寄存器
 
 - RCC->AHBENR.BIT.GPIOEN = 1; // 打开 GPIO 模块时钟
 
 - RCC->AHBENR.BIT.SYSCFGEN = 1; // 打开 SYSCFG 模块时钟(SWJ 复用)
 
 - APB0_CFG->APB0ENR.BIT.UART1EN = 1; // 打开 UART1 时钟
 
 - RCC->RCCLOCK = 0x0; // lock RCC config
 
 - GPIOB_CFG->LCKR.V32 = 0x5AA50000; // unlock PB config
 
 - GPIOB_IOD->MODER |= 0x0100; // set PB8 output
 
 - GPIOB_IOD->MODER &= 0xFDFF; // set PB9 input (default)
 
 - GPIOB_CFG->PUPDR.BIT.PUPDR9 = 1; // set PB9 pull-up, 01b: pull-up
 
 - GPIOB_IOD->ODR |= 0x0100; // set PB8 = 1
 
 - SYSCFG->SAFR.V32 = 0x5AA50008; // SWJ 只使用 SWD 接口,释放 PA2 口
 
 - GPIOB_CFG->AFRH.BIT.AFR8 = 7; // PB8 映射到 TXD1
 
 - GPIOB_CFG->AFRH.BIT.AFR9 = 7; // PB9 映射到 RXD1
 
 - GPIOB_CFG->LCKR.V32 = 0x5AA5FFFF; // lock PE config
 
 - UART1->BRT.BIT.SBRT = 194; // 设置波特率为 9.6KBps,30M/16/9.6K=195.3125
 
 - UART1->BRT.BIT.BFINE = 5; // 0.3125*16=5
 
 - UART1->CR.BIT.SM = 1; // type 1: 8/1/1/none, variable baud rate
 
 - UART1->CR.BIT.SBRTEN = 1; // enable baud rate generation
 
 - UART1->CR.BIT.TEN = 1; // enable txd
 
 - UART1->CR.BIT.REN = 1; // enable rxd
 
 - while(1) // main loop
 
 - {
 
 - rcv_byte = WaitUartReceive(UART1); // Uart 接收
 
 - WaitUartTransmit(UART1,rcv_byte+0x33); // Uart 发送
 
 - }
 
 - }
 
  
  
 
 
  |