零、所需文件及环境
1、第二章建立好的定时器点灯程序
2、编译环境MDK5(KEIL5)
3、一个GD32F407VET6硬件
4、一个下载器j-link 或 st-link等
5.代码编辑器 Notepad++ (可以不要 用记事本也能编译 都是习惯的问题)
6.USB转TTL设备 用于连接电脑串口助手
壹、复制定时器点灯程序
1.1 复制定时器点灯程序并进行重命名
1.2 进入USER/BSP文件夹下 复制BSP_LED文件夹改为BSP_DEBUG
1.3 进入USER/BSP/BSP_DEBUG文件夹,修改文件名
贰、编写BSP_DEBUG.c与BSP_DEBUG.h代码
2.1 打开BSP_DEBUG.h修改为
#ifndef __BSP_DEBUG_H
#define __BSP_DEBUG_H#include "gd32f4xx.h"
#include <stdio.h>#define BSP_DEBUG_REC_LEN 200 //定义最大接收字节数 200
extern uint8_t BSP_DEBUG_RX_BUF[BSP_DEBUG_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
extern uint16_t BSP_DEBUG_RX_BUF_LEN; //接收状态标记extern void BSP_DEBUG(uint32_t baudval);
extern void BSP_DEBUG_SendHex(uint8_t *buf,uint16_t len);
#endif
2.2 打开BSP_DEBUG.c修改为 其他串口也可使用此程序
#include "BSP_DEBUG.h"
#define BSP_DEBUGx_RX_PIN GPIO_PIN_6
#define BSP_DEBUGx_TX_PIN GPIO_PIN_5
#define BSP_DEBUGx_GPIO_PORT GPIOD
#define BSP_DEBUGx_GPIO_CLK RCU_GPIOD
#define BSP_DEBUGx USART1
#define BSP_DEBUGx_RX_IRQn USART1_IRQn
#define BSP_DEBUGx_RX_Pre_Priority 1
#define BSP_DEBUGx_RX_Sub_Priority 0
#define BSP_DEBUGx_RX_IRQHandler USART1_IRQHandler
#define BSP_DEBUGx_CLK RCU_USART1
#define BSP_DEBUG_REC_LEN 200 //定义最大接收字节数 200
uint8_t BSP_DEBUG_RX_BUF[BSP_DEBUG_REC_LEN]={0}; //接收缓冲,最大USART_REC_LEN个字节.
uint16_t BSP_DEBUG_RX_BUF_LEN=0; //接收状态标记/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{
usart_data_transmit(USART1, (uint8_t)ch);
while(RESET == usart_flag_get(USART1, USART_FLAG_TBE));
return ch;
}void BSP_DEBUG(uint32_t baudval)
{
/* enable GPIO clock */
rcu_periph_clock_enable(BSP_DEBUGx_GPIO_CLK);//使能GPIOA时钟
/* enable USART clock */
rcu_periph_clock_enable(BSP_DEBUGx_CLK);//使能USART0时钟gpio_af_set(BSP_DEBUGx_GPIO_PORT, GPIO_AF_7, BSP_DEBUGx_TX_PIN);//复用功能7
gpio_mode_set(BSP_DEBUGx_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, BSP_DEBUGx_TX_PIN);//PA9配置成串口输出
gpio_output_options_set(BSP_DEBUGx_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,BSP_DEBUGx_TX_PIN);
gpio_af_set(BSP_DEBUGx_GPIO_PORT, GPIO_AF_7, BSP_DEBUGx_RX_PIN);//复用功能7
gpio_mode_set(BSP_DEBUGx_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, BSP_DEBUGx_RX_PIN);//PA10配置成串口输入
gpio_output_options_set(BSP_DEBUGx_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,BSP_DEBUGx_RX_PIN);usart_deinit(BSP_DEBUGx); // 串口复位
usart_word_length_set(BSP_DEBUGx, USART_WL_8BIT); // 字长
usart_stop_bit_set(BSP_DEBUGx, USART_STB_1BIT); // 停止位
usart_parity_config(BSP_DEBUGx, USART_PM_NONE);
usart_baudrate_set(BSP_DEBUGx, baudval); // 波特率
usart_receive_config(BSP_DEBUGx, USART_RECEIVE_ENABLE); // 接收使能
usart_transmit_config(BSP_DEBUGx, USART_TRANSMIT_ENABLE); // 发送使能
usart_hardware_flow_rts_config(BSP_DEBUGx, USART_RTS_DISABLE);
usart_hardware_flow_cts_config(BSP_DEBUGx, USART_CTS_DISABLE);
usart_enable(BSP_DEBUGx); // 串口使能
nvic_irq_enable(BSP_DEBUGx_RX_IRQn,BSP_DEBUGx_RX_Pre_Priority,BSP_DEBUGx_RX_Sub_Priority);}
void BSP_DEBUG_SendHex(uint8_t *buf,uint16_t len)
{
uint8_t t;
// SET_485_TX // 发送使能
for(t=0;t<len;t++)
{
while(usart_flag_get(BSP_DEBUGx, USART_FLAG_TC) == RESET);
usart_data_transmit(BSP_DEBUGx,buf[t]);
}
while(usart_flag_get(BSP_DEBUGx, USART_FLAG_TC) == RESET){;}
usart_interrupt_enable(BSP_DEBUGx, USART_INT_RBNE); // 接收中断使能
// SET_485_RX
}void BSP_DEBUGx_RX_IRQHandler(void)
{
uint8_t data;
if((RESET != usart_interrupt_flag_get(BSP_DEBUGx, USART_INT_FLAG_RBNE)) &&
(RESET != usart_flag_get(BSP_DEBUGx, USART_FLAG_RBNE))){
/* Read one byte from the receive data register */
data =usart_data_receive(BSP_DEBUGx);
BSP_DEBUG_RX_BUF[BSP_DEBUG_RX_BUF_LEN++] = data;
}}
叁、打开工程,将BSP_DEBUG.c添加入工程并添加头文件路径
肆、修改main函数
#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "BSP_LED.h"
#include "BSP_TIMER.h"
#include "BSP_DEBUG.h"
uint8_t text_data[10]={1,2,3,4,5,6,7,8,9,0};
int main(void)
{
systick_config();
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
LED_Init();
timer_config(8400-1,5000-1);//8400*5000/84M=0.5S
BSP_DEBUG(115200);
BSP_DEBUG_SendHex(&text_data[0],10);
while(1) {
// LED_Open();
// delay_1ms(500);
BSP_DEBUG_SendHex(&BSP_DEBUG_RX_BUF[0],BSP_DEBUG_RX_BUF_LEN);
// LED_Close();
// delay_1ms(500);
}
}
伍、编译下载
4.1 好家伙 乱码 软件和我设置的波特率一致啊
4.2 改时钟 外部输入的时钟和代码里面的时钟对应不上 25改为8M
4.3 时钟改完之后显示正常了