我以前使用过ST的STM32F031微控制器,但是由于流行病或导致ST芯片价格上涨的原因,ST芯片的价格涨幅太大。因为我们正在制造产品,并且数量相对较大,所以无法再使用ST的芯片。
成本是真实的。负担不起。
因此选择了许多家用MCU。最后,GD因其卓越的新性能和低廉的价格而入选。
GD32E230已实现与标准STM32F031的PIN TO PIN兼容性。寄存器并不完全兼容,但是GD的主频率可以达到72M,这很可怕。
STM32F031仅为48M,之前必须超频至56M。我不得不说,GD很强!仅比较固件库,GD库功能包比ST库要好得多。
当然,ST现在主要在推广HAL库,这个HAL库确实非常好。使用串行端口之前,还必须配置引脚和时钟。
GPIO管脚配置空隙com_gpio_init(无效)(rcu_periph_clock_enable(RCU_GPIOA); gpio_af_set(GPIOA,GPIO_AF_1,GPIO_PIN_9); gpio_af_set(GPIOA,GPIO_AF_1,GPIO_PIN_TYPE_PU_set,GPIO_PULL_PU_GPIO_PU_GPIO,GPIO_PU_MODE_GPIO,GPIO_PU_MODE,GPIO_PU_MODE,GPIO_PULL_PU_set,GPIO_OSPEED_10MHZ,GPIO_PIN_9); gpio_mode_set(GPIOA, GPIO_MODE_AF,GPIO_PUPD_PULLUP,GPIO_PIN_10); gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_10MHZ,GPIO_PIN_10); gpio_mode_set(GPIOA,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_8); gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_8); GPIO_BOP(GPIOA)=(uint32_t的)GPIO_PIN_8; GPIO_BC(GPIOA)=(uint32_t)GPIO_PIN_8;}串行端口使用USART0,对应于PA9和PA10,相当于STM32的USART1;配置USART时,需要首先使用gpio_mode_set( )配置IO端口的工作模式和输入/输出类型gpio_output_options_set()配置速度等参数。 RS485的使能引脚。
串行端口配置void com_usart_init(void){/ *启用USART时钟* / rcu_periph_clock_enable(RCU_USART0); / * USART配置* / usart_deinit(USART0); usart_baudrate_set(USART0,2500000U); usart_receive_config(USARTUS_ENABLE,USART_REC)USART_TRANSMIT_ENABLE); usart_enable(USART0);}启用USART时钟,设置波特率,并启用接收和发送。串行端口中断配置串行端口中断的配置仅需要一个API函数,这非常简单。
nvic_irq_enable(USART0_IRQn,0);以下是中断服务功能。屏蔽的代码是直接操作寄存器,从而加快了代码的速度,因为我的项目需要更高的串行端口速度。
串行端口将数据接收到中断后,首先获取USART中断标志位的状态,该状态由usart_interrupt_flag_get(EVAL_COM,USART_INT_FLAG_RBNE)判断。然后使用该阵列接收串行端口数据,确定数据是否为0x1A,如果满足条件,则输入if函数。
判断串口数据接收标志位是否为RESET,然后通过该功能发送数据,在发送禁用的串口中断后,为了下次进入中断,此处与st的库函数处理方法不同。我想在测试时使用usart_flag_clear()函数清除中断标志,但是手册中没有清除中断标志的选项。
GD通过禁用串行端口中断来退出中断。 void USART0_IRQHandler(void){// if(RESET!=(USART_STAT(USART0)& amp; amp; 0x00000010))// {// GPIO_BOP(GPIOA)=(uint32_t)GPIO_PIN_8; // receiver_buffer [0] =(uint16_t) (GET_BITS(USART_RDATA(USART0),0U,8U)); // USART_REG_VAL(USART0,USART_INT_TBE)| = BIT(USART_BIT_POS(USART_INT_TBE))); // //)// // if(RESET!=(USART_STAT(USART0)& amp; 0x00000040))// {// USART_TDATA(USART0)=(USART_TDATA_TDATA& generator_buffer [txcount ++]);; // if(txcount == transfersize){// USART_REG_VAL(USART0,USART_INT_TBE)& =〜BIT(USART_BIT_POS(USART_INT_TBE)); // GPIO_BC(GPIOA)=(uint32_t)GPIO_PIN_8; // txcount = 0; //} //} if(RESET!= usart_interrupt_flag_get(EVAL_COM,USART_INT_FLAG_RBNE)){/ *接收数据* / receiver_buffer [0] = usart_data_receive(EVAL_COM); usart_interrupt_enable(EVAL_COM,USART_INT_TBE); if(receiver_buffer [0] == 0x1A){/ *发送数据* / gpio_bit_set(GPIOA,GPIO_PIN_8); while(usart_flag_get = USART)0,USART; usart_data_transmit(EVAL_COM,发送器缓冲区[4]); while(usart_f lag_get(USART0,USART_FLAG_TC)== RESET); gpio_bit_reset(GPIOA,GPIO_PIN_8); // usart_flag_clear(USART0,USART_FLAG_TC); usart_interrupt_disable(EVAL_COM,USART_INT_TBE);}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} }}}}}}}}})之后再回覆资料。
DMA配置无效USART_DMA_Init(void){dma_parameter_struct dma_init_struct; / *启用DMA时钟* / rcu_periph_clock_enable(RCU_DMA); rcu_periph_clock_enable(RCU_CFGC