1.前言
此实验将在搭建好环境的基础下,直接利用IDE新建的C项目稍微修改就可以实现UART通讯和定时器中断实现灯闪烁
因为新建好的demo用的uart组是usart0,对应的PB15,TX不方便我们调试,因为我的烧录用的PA6 PA7,烧录完后还要把线拨来拨去不方便,所以此项目会教你怎么修改uart组和映射的IO口
搭建环境的就不讲了,可以看我的上一篇文章
2.实验开始
gd32vw553h_eval.h
打开gd32vw553h_eval.h,将这几个宏内容进行替换,可以看下图PA6对应的UART2,AF10的复用功能,接下来在代码进行修改,RX没用到就暂时不管了,要用的话也是一样道理修改就行

#define COMn 1U
#define EVAL_COM0 UART2
#define EVAL_COM0_CLK RCU_UART2
#define EVAL_COM0_TX_PIN GPIO_PIN_6
// #define EVAL_COM0_RX_PIN GPIO_PIN_8
#define EVAL_COM0_TX_GPIO_PORT GPIOA
#define EVAL_COM0_TX_GPIO_CLK RCU_GPIOA
#define EVAL_COM0_TX_AF GPIO_AF_10
// #define EVAL_COM0_RX_GPIO_PORT GPIOA
// #define EVAL_COM0_RX_GPIO_CLK RCU_GPIOA
// #define EVAL_COM0_RX_AF GPIO_AF_2
#define LED1_PIN GPIO_PIN_3
#define LED1_GPIO_PORT GPIOA
#define LED1_GPIO_CLK RCU_GPIOA
#define LED2_PIN GPIO_PIN_4
#define LED2_GPIO_PORT GPIOA
#define LED2_GPIO_CLK RCU_GPIOA
#define LED3_PIN GPIO_PIN_5
#define LED3_GPIO_PORT GPIOA
#define LED3_GPIO_CLK RCU_GPIOALED灯可以改成自己想用的脚,我用的是PA3 PA4 PA5
main函数
我将里面一些功能进行删减和修改了,最终实验现象就是上电打印固件库的版本号和各个总线的速度,还有LED灯在不停的闪烁
#include "gd32vw55x.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "gd32vw553h_eval.h"
/*!
\brief toggle the led every 500ms
\param[in] none
\param[out] none
\retval none
*/
void led_spark(void)
{
static __IO uint32_t timingdelaylocal = 0U;
if(timingdelaylocal) {
if(timingdelaylocal < 500U) {
gd_eval_led_on(LED1);
gd_eval_led_on(LED2);
gd_eval_led_on(LED3);
} else {
gd_eval_led_off(LED1);
gd_eval_led_off(LED2);
gd_eval_led_off(LED3);
}
timingdelaylocal--;
} else {
timingdelaylocal = 1000U;
}
}
int main(void)
{
#ifdef __FIRMWARE_VERSION_DEFINE
// 定义固件版本号变量
uint32_t fw_ver = 0;
#endif /* __FIRMWARE_VERSION_DEFINE */
/* 配置系统滴答定时器 */
/* configure systick */
systick_config();
/* 设置ECLIC优先级组为LEVEL3_PRIO1 */
eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1);
/* 初始化LED、USART和按键 */
/* initilize the LEDs, USART and key */
gd_eval_led_init(LED1);
gd_eval_led_init(LED2);
gd_eval_led_init(LED3);
gd_eval_com_init(EVAL_COM0);
#ifdef __FIRMWARE_VERSION_DEFINE
// 获取固件版本号
fw_ver = gd32vw55x_firmware_version_get();
/* 打印固件版本 */
/* print firmware version */
printf("GD32VW55X series firmware version: V%d.%d.%d\n", (uint8_t)(fw_ver >> 24), (uint8_t)(fw_ver >> 16), (uint8_t)(fw_ver >> 8));
#endif /* __FIRMWARE_VERSION_DEFINE */
/* 打印系统、AHB、APB1和APB2的时钟频率 */
/* print out the clock frequency of system, AHB, APB1 and APB2 */
printf("CK_SYS is %d\n", rcu_clock_freq_get(CK_SYS));
printf("CK_AHB is %d\n", rcu_clock_freq_get(CK_AHB));
printf("CK_APB1 is %d\n", rcu_clock_freq_get(CK_APB1));
printf("CK_APB2 is %d\n", rcu_clock_freq_get(CK_APB2));
while(1) {
;
}
}gd32vw55x_it.c
这是定时器中断的处理handle
#include "gd32vw55x_it.h"
#include "main.h"
#include "systick.h"
/*!
\brief core private timer handle function
\param[in] none
\param[out] none
\retval none
*/
void eclic_mtip_handler(void)
{
// 清除CLIC_INT_TMR的中断挂起标志
ECLIC_ClearPendingIRQ(CLIC_INT_TMR);
// 点亮LED灯
led_spark();
// 延迟递减 这个没用到
delay_decrement();
}
gd32vw553h_eval.c
我只对gd_eval_com_init函数进行了修改
void gd_eval_com_init(uint32_t com)
{
/* 使能GPIO时钟 */
uint32_t COM_ID = 0U;
if(EVAL_COM0 == com)
{
COM_ID = 0U;
}
/* 使能GPIO时钟 */
rcu_periph_clock_enable(EVAL_COM0_TX_GPIO_CLK);
// rcu_periph_clock_enable(EVAL_COM0_RX_GPIO_CLK);
/* 使能USART时钟 */
rcu_periph_clock_enable(COM_CLK[COM_ID]);
/* 将端口连接到USARTx_Tx */
gpio_af_set(EVAL_COM0_TX_GPIO_PORT, EVAL_COM0_TX_AF, COM_TX_PIN[COM_ID]);
/* 将端口连接到USARTx_Rx */
// gpio_af_set(EVAL_COM0_RX_GPIO_PORT, EVAL_COM0_RX_AF, COM_RX_PIN[COM_ID]);
/* 配置USART Tx为复用推挽输出 */
gpio_mode_set(EVAL_COM0_TX_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, COM_TX_PIN[COM_ID]);
gpio_output_options_set(EVAL_COM0_TX_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, COM_TX_PIN[COM_ID]);
/* 配置USART Rx为复用推挽输出 */
// gpio_mode_set(EVAL_COM0_RX_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, COM_RX_PIN[COM_ID]);
// gpio_output_options_set(EVAL_COM0_RX_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, COM_RX_PIN[COM_ID]);
/* USART配置 */
usart_deinit(com);
usart_baudrate_set(com, 115200U);
// usart_receive_config(com, USART_RECEIVE_ENABLE);
usart_transmit_config(com, USART_TRANSMIT_ENABLE);
usart_enable(com);
}
3.实验结果
烧录完成后不需要拔线,烧录完成后还是这个端口直接复位就可以看到实验现象了,打印跟灯闪都有,完成!!!!!1

