芯片复制GD32F470系列Rs-485驱动程序
- /*
- 芯片复制主程序如下
- main.c
- 使用中断+DMA数据搬运实现驱动RS-458
- */
- #include "gd32f4xx.h"
- #include "systick.h"
- #define USART1_DATA_ADDRESS ((uint32_t)&USART_DATA(USART1))
- #define RS485BufferSize 256
- uint8_t RS485RxBuffer[RS485BufferSize]={0}; //485数据接收缓冲区
- uint8_t RS485RxP = 0; //485接收缓冲区接收位置指示
- uint8_t RS485RxPre = 0; //485帧头指示
- uint8_t RS485TxBuffer[RS485BufferSize]={0}; //485数据发送缓冲区
- uint8_t RS485TxP = 0; //485发送缓冲区发送位置指示
- uint8_t RS485RxFrameBuffer[RS485BufferSize]; //485接收帧缓冲
- uint8_t RS485RxCount = 0; //485接收计数
- uint8_t RS485RxFlag = 0; //RS485帧接收完成标志,逻辑1有效
- /*485OE使用PE15引脚,高电平发送,低电平接收*/
- void Drv_485OE_Init(void)
- {
- /* 打开GPIOE时钟 */
- rcu_periph_clock_enable(RCU_GPIOE);
- /* 配置PE15口为推挽输出,无上下拉 */
- gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_15);
- gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);
- /* 默认485处于接受模式 */
- Drv_485_RxEn();
- }
- // 485 RX_EN
- void Drv_485_RxEn(void)
- {
- gpio_bit_reset(GPIOE, GPIO_PIN_15);
- }
- // 485 TX_EN
- void Drv_485_TxEn(void)
- {
- gpio_bit_set(GPIOE, GPIO_PIN_15);
- }
- //Rs_485初始化
- void Drv_Rs_485_Init(void)
- {
- dma_single_data_parameter_struct dma_init_struct;
- /* enable GPIO clock */
- rcu_periph_clock_enable(RCU_GPIOB);
- /* enable UART clock */
- rcu_periph_clock_enable(RCU_USART2);
- /* configure the USART2 TX pin and USART2 RX pin */
- gpio_af_set(GPIOB, GPIO_AF_7, GPIO_PIN_10); //Tx
- gpio_af_set(GPIOB, GPIO_AF_7, GPIO_PIN_11); //Rx
- /* configure USART2 TX as alternate function push-pull */
- gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10);
- gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5);
- /* configure USART2 RX as alternate function push-pull */
- gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_11);
- gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
- /* USART configure */
- usart_deinit(USART2); //取消初始化USART2
- usart_baudrate_set(USART2, 38400U); //波特率38400U
- usart_receive_config(USART2, USART_RECEIVE_ENABLE);
- usart_transmit_config(USART2, USART_TRANSMIT_ENABLE);
- usart_enable(USART2);
-
- usart_interrupt_flag_clear(USART2, USART_INT_FLAG_ERR_ORERR);
- usart_interrupt_enable(USART2, USART_INT_ERR);
-
- /* USART interrupt configuration */
- nvic_irq_enable(USART2_IRQn, 2, 0); //优先级为2
- }

芯片解密