GD32L233C-START 评测 (2)LPUART串口终端
[复制链接]
本帖最后由 wenyangzeng 于 2022-2-17 15:57 编辑
【GD32L233C-START 评测 】(2)LPUART串口终端
针对的GD32L233C-START的评测,如果仍然使用非低功耗的那些演示DEMO,就失去了GD32L233C最突出的优势了。
所以笔者对GD32L233C的评测从一开始就定位在低功耗方面。刚开始考虑连接笔段式LCD模块来显示数据。但发现只有64PIN的芯片才支持笔段式LCD驱动。而外接OLED等显示设备又不太符合低功耗的要求。故改成利用GD32L233C-START的LPUART功能建立一个低功耗串口通讯终端,用于整个评测过程中对开发板的各种低功耗运行的控制和显示。虽然GD32L233C-START的CN1就能够通过USB转USART实现与PC机的串口通讯。但 使用LPUART方式能更直观地评测GD32L233C的低功耗特性。
GD32L233C-START的PA2和PA3是LPUART-TX和LPUART-RX引脚。连接方式见下图:
串口通讯波特率115200、8位数据位、1位停止位、无奇偶校验、不定长中断方式进行接收。设定当LPUART接收到1帧完整数据后,GD32L233C将该帧数据以从尾到头反方向发送回PC终端。
使用不定长接收方式可以适应各种不同长度数据接收处理。
代码:
#include "gd32l23x.h"
#include <stdio.h>
#include "gd32l233r_eval.h"
#define LPUART_RDATA_ADDRESS ((uint32_t)&LPUART_RDATA)
uint8_t rxbuffer[256];
uint8_t tx_count = 0;
__IO uint8_t rx_count = 0;
__IO uint8_t receive_flag = 0;
void lpuart_config(void);
void nvic_config(void);
int main(void)
{
gd_eval_led_init(LED1);
nvic_config();
lpuart_config();
while(RESET == lpuart_flag_get(LPUART_FLAG_IDLE));
lpuart_flag_clear(LPUART_FLAG_IDLE);
lpuart_interrupt_enable(LPUART_INT_IDLE);
lpuart_interrupt_enable(LPUART_INT_RBNE);
while(1) {
if(1 == receive_flag) {
gd_eval_led_on(LED1);
for(tx_count = rx_count; tx_count>0; tx_count--) {
while(RESET == lpuart_flag_get(LPUART_FLAG_TBE));
lpuart_data_transmit(rxbuffer[tx_count]);
}
rx_count=0;
receive_flag = 0;
gd_eval_led_off(LED1);
}
}
}
void lpuart_config(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_LPUART);
gpio_af_set(GPIOA, GPIO_AF_8, GPIO_PIN_2);
gpio_af_set(GPIOA, GPIO_AF_8, GPIO_PIN_3);
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2);
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_3);
lpuart_deinit();
lpuart_word_length_set(LPUART_WL_8BIT);
lpuart_stop_bit_set(LPUART_STB_1BIT);
lpuart_parity_config(LPUART_PM_NONE);
lpuart_baudrate_set(115200U);
lpuart_receive_config(LPUART_RECEIVE_ENABLE);
lpuart_transmit_config(LPUART_TRANSMIT_ENABLE);
lpuart_enable();
}
void nvic_config(void)
{
nvic_irq_enable(LPUART_IRQn, 0);
}
void LPUART_IRQHandler(void)
{
if(RESET != lpuart_interrupt_flag_get(LPUART_INT_FLAG_IDLE)){
lpuart_interrupt_flag_clear(LPUART_INT_FLAG_IDLE);
gd_eval_led_toggle(LED1);
receive_flag = 1;
}
else
if(RESET != lpuart_interrupt_flag_get(LPUART_INT_FLAG_RBNE))
{
rxbuffer[rx_count++] = lpuart_data_receive();
}
}
调试过程中发现了gd32l233r_eval.h中对LED1和LED2的定义是错误的,导致LED1和LED2无法点亮:
#define LED1_PIN GPIO_PIN_7
#define LED1_GPIO_PORT GPIOC
#define LED1_GPIO_CLK RCU_GPIOA
#define LED2_PIN GPIO_PIN_8
#define LED2_GPIO_PORT GPIOC
#define LED2_GPIO_CLK RCU_GPIOA
其中GPIOC是错的,应该改为GPIOA
|