喜欢8次
本人用蓝牙测试通过了三个串口模块,其中USART1需要重映射配置。USART0我暂时没有启用!
下图是USART1的使用,相关接口映射可以查找“用户指南”,代码在文末(重映射需要开启AF时钟——感谢胡灿老师!)
另外我重写了delay_1ms函数,改为了delay_1us,后续会用到。
//参考文件
// ~/Nuclei/SoC/gd32vf103/Board/gd32vf103v_eval/Include/gd32vf103v_eval.h
//USART2 UART3可以直接正常使用,USART1需要重映射
//由于用户手册上没找到USART0的接收端口,所以目前没有测试使用过
#include
#include "nuclei_sdk_hal.h"
#include "gd32vf103_usart.h"
#include "gd32vf103_gpio.h"
#include "gd32vf103_exti.h"
#include "nuclei_sdk_soc.h"
#define COMn (4U)
#define GD32_COM0 USART0
#define GD32_COM0_CLK RCU_USART0
#define GD32_COM0_TX_PIN GPIO_PIN_9
#define GD32_COM0_RX_PIN GPIO_PIN_10
#define GD32_COM0_GPIO_PORT GPIOA
#define GD32_COM0_GPIO_CLK RCU_GPIOA
#define GD32_COM1 USART1
#define GD32_COM1_CLK RCU_USART1
#define GD32_COM1_TX_PIN GPIO_PIN_5
#define GD32_COM1_RX_PIN GPIO_PIN_6
#define GD32_COM1_GPIO_PORT GPIOD
#define GD32_COM1_GPIO_CLK RCU_GPIOD
#define GD32_COM2 USART2
#define GD32_COM2_CLK RCU_USART2
#define GD32_COM2_TX_PIN GPIO_PIN_10
#define GD32_COM2_RX_PIN GPIO_PIN_11
#define GD32_COM2_GPIO_PORT GPIOB
#define GD32_COM2_GPIO_CLK RCU_GPIOB
#define GD32_COM3 UART3
#define GD32_COM3_CLK RCU_UART3
#define GD32_COM3_TX_PIN GPIO_PIN_10
#define GD32_COM3_RX_PIN GPIO_PIN_11
#define GD32_COM3_GPIO_PORT GPIOC
#define GD32_COM3_GPIO_CLK RCU_GPIOC
/* private variables */
static rcu_periph_enum COM_CLK[COMn] = {GD32_COM0_CLK, GD32_COM1_CLK,GD32_COM2_CLK,GD32_COM3_CLK};
static uint32_t COM_TX_PIN[COMn] = {GD32_COM0_TX_PIN, GD32_COM1_TX_PIN,GD32_COM2_TX_PIN,GD32_COM3_TX_PIN};
static uint32_t COM_RX_PIN[COMn] = {GD32_COM0_RX_PIN, GD32_COM1_RX_PIN,GD32_COM2_RX_PIN,GD32_COM3_RX_PIN};
static uint32_t COM_GPIO_PORT[COMn] = {GD32_COM0_GPIO_PORT, GD32_COM1_GPIO_PORT,GD32_COM2_GPIO_PORT,GD32_COM3_GPIO_PORT};
static rcu_periph_enum COM_GPIO_CLK[COMn] = {GD32_COM0_GPIO_CLK, GD32_COM1_GPIO_CLK,GD32_COM2_GPIO_CLK,GD32_COM3_GPIO_CLK};
void gd_com_init(uint32_t com);
int USART_IRQHandler(uint32_t com);
void delay_1us(uint32_t count);
int main(void)
{
//select
IRQn_Type IRQn=USART1_IRQn;
uint32_t COM=GD32_COM1;
//select end
//initial
gd_com_init(COM);
usart_interrupt_enable(COM,USART_INT_RBNE); //使能接收中断
ECLIC_Register_IRQ(IRQn,ECLIC_NON_VECTOR_INTERRUPT,ECLIC_LEVEL_TRIGGER,1,0,USART_IRQHandler(COM)); // 配置中断函数
__enable_irq();
usart_enable(COM);
//initial end
//transmit
for (uint32_t i = 1; i <= 10; i ++) {
usart_data_transmit(COM,i);
while ( usart_flag_get(COM, USART_FLAG_TBE)== RESET){}; // 等待发送完成
delay_1us(1000000);
}
//transmit end
usart_interrupt_disable(COM,USART_INT_RBNE);
return 0;
}
void gd_com_init(uint32_t com)
{
uint32_t com_id = 0U;
if(GD32_COM0 == com){
com_id = 0U;
}else if(GD32_COM1 == com){
com_id = 1U;
/* enable AF clock */
rcu_periph_clock_enable(RCU_AF);
}else if(GD32_COM2 == com){
com_id = 2U;
}else if(GD32_COM3 == com){
com_id = 3U;
}
/* enable GPIO clock */
rcu_periph_clock_enable(COM_GPIO_CLK[com_id]);
/* enable USART clock */
rcu_periph_clock_enable(COM_CLK[com_id]);
/* connect port to USARTx_Tx */
gpio_init(COM_GPIO_PORT[com_id], GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, COM_TX_PIN[com_id]);
/* connect port to USARTx_Rx */
gpio_init(COM_GPIO_PORT[com_id], GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, COM_RX_PIN[com_id]);
/* USART configure */
/////////////////////////////////////////////////////////////////
//reconfig
if(GD32_COM1 == com){
gpio_pin_remap_config(GPIO_USART1_REMAP, ENABLE);
}
//reconfig end
//////////////////////////////////////////////////////////////////
usart_deinit(com);
usart_baudrate_set(com, 9600U);
usart_word_length_set(com, USART_WL_8BIT);
usart_parity_config(com, USART_PM_NONE);
usart_stop_bit_set(com, USART_STB_1BIT);
usart_hardware_flow_rts_config(com, USART_RTS_DISABLE);
usart_hardware_flow_cts_config(com, USART_CTS_DISABLE);
usart_receive_config(com, USART_RECEIVE_ENABLE);
usart_transmit_config(com, USART_TRANSMIT_ENABLE);
//usart_enable(com);
}
int USART_IRQHandler(uint32_t com){
if(usart_interrupt_flag_get(com, USART_INT_FLAG_RBNE) != RESET){
uint8_t serial_recv = usart_data_receive(com);
printf("%d",serial_recv);
}
return 0;
}
void delay_1us(uint32_t count)
{
uint64_t start_mtime, delta_mtime;
//uint64_t delay_ticks = (SOC_TIMER_FREQ * (uint64_t)count) / 1000;
uint64_t delay_ticks = (SOC_TIMER_FREQ * (uint64_t)count)/1000000;
start_mtime = SysTimer_GetLoadValue();
do {
delta_mtime = SysTimer_GetLoadValue() - start_mtime;
} while (delta_mtime < delay_ticks);
}