GD32F103RCT6单片机串口初始化单片机解密
| 单片机解密//USART0 void Usart0Init(uint32_t baud) //PA10 RX PA9 TX // 单片机解密{ uint32_t Udiv = 0; RCU_APB2EN |= 0x00000001<<2; //使能GPIOA时钟 RCU_APB2EN |= 0x00000001<<14; //使能USART0时钟 GPIO_CTL1(GPIOA) &= 0xfffff0ff; //设置RX引脚浮空输入 PA10 GPIO_CTL1(GPIOA) |= (0x00000004<<(4*2)); GPIO_CTL1(GPIOA) &= 0xffffff0f; //设置TX引脚复用推完输出 50M PA9 GPIO_CTL1(GPIOA) |= (0x0000000B<<(4*1)); RCU_APB2RST |= (0x00000001 <<14); //复位USART0 RCU_APB2RST &= ~(0x00000001 <<14); //停止复位 //单片机解密计算波特率分频比 udiv = UART0_CLK/(16*baud) 但寄存器中中小数点后面有四位,则需要扩大16倍 则 = UART0_CLK/baud //单片机解密时钟频率为APB2(系统初始化时已设定APB2等于APB等于系统时钟108M) Udiv = (APB2_CLK+baud/2)/baud; //参考库函数比用户手册上大一些,是不是因为经验不稳定而加大一点 USART_BAUD(USART0) = (Udiv) & 0x0000ffff; //分频比 共16位 12位整数 4位小数 USART_CTL0(USART0) &= ~(0x00000001 <<12); //12位设置为0 表示8位数据位 USART_CTL1(USART0) &= ~(0x00000003 <<12); //12-13位设置为0 表示1位停止位 USART_CTL0(USART0) &= ~(0x00000003 <<9); //9-10位设置为0 表示无效验位 USART_CTL2(USART0) &= ~(0x00000003 <<8); //8-9位设置为0 表示禁用RTS CTS USART_CTL0(USART0) &= ~(0x00000003 <<2); //第2位 设置为1 使能接收 3位设置为1 使能发送 USART_CTL0(USART0) |= (0x00000003 <<2); USART_CTL0(USART0) |= (0x00000003 <<5); //5位置1 接收缓冲器清空中断 6位置1 发送完成中断 nvic_irq_enable(USART0_IRQn, 0, 0); //设置中断优先级 USART_CTL0(USART0) |= (0x00000001 <<13); //使能USART0 } void USART0_IRQHandler(void) { uint32_t tmp = 0; if(USART_STAT(USART0) &(0x00000001 <<6)) //发送完成 { USART_STAT(USART0) &= ~(0x00000001 <<6); if(mUsart0.TX.OntPtr != mUsart0.TX.InPtr) { USART_DATA(USART0) = mUsart0.TX.Buffer[mUsart0.TX.OntPtr]; mUsart0.TX.OntPtr++; if(mUsart0.TX.OntPtr >=USART0_TX_BUFFER_SIZE) { mUsart0.TX.OntPtr = 0; } } else { mUsart0.IsSending = 0; } } |

芯片解密