项目说明
本次项目依靠环境为FreeRTOS
完成情况:
完成对Usart的初始化
完成Printf的映射
代码
代码部分的风格按照原来在STM32
上的写法。
usart.c
#include "usart.h"
#include "gpio.h"
UART_HandleTypeDef usart0;
void My_Usart_Init(void)
{
usart0.usart_periph = USART0;
usart0.Init.BaudRate = 115200U;
usart0.Init.WordLength = USART_WL_8BIT;
usart0.Init.StopBits = USART_STB_1BIT;
usart0.Init.Parity = USART_PM_NONE;
usart_deinit(usart0.usart_periph);
usart_baudrate_set(usart0.usart_periph,usart0.Init.BaudRate);
usart_word_length_set(usart0.usart_periph,usart0.Init.WordLength);
usart_stop_bit_set(usart0.usart_periph,usart0.Init.StopBits);
usart_parity_config(usart0.usart_periph,usart0.Init.Parity);
usart_receive_config(usart0.usart_periph,USART_RECEIVE_ENABLE);
usart_transmit_config(usart0.usart_periph,USART_TRANSMIT_ENABLE);
usart_enable(usart0.usart_periph);
usart_interrupt_enable(usart0.usart_periph, USART_INT_RBNE);
usart_interrupt_enable(usart0.usart_periph, USART_INT_ERR);
nvic_irq_enable(USART0_IRQn,0,0);
}
void My_Usart_MspInit(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_USART0);
GPIO_InitStruct.gpio_periph = GPIOA;
GPIO_InitStruct.mode = GPIO_MODE_AF;
GPIO_InitStruct.pin = GPIO_PIN_9;
GPIO_InitStruct.otype = GPIO_OTYPE_PP;
GPIO_InitStruct.speed = GPIO_OSPEED_50MHZ;
GPIO_InitStruct.pull_up_down = GPIO_PUPD_PULLUP;
GPIO_InitStruct.alt_func_num=GPIO_AF_1;
gpio_af_set(GPIO_InitStruct.gpio_periph,GPIO_InitStruct.alt_func_num,GPIO_InitStruct.pin);
gpio_mode_set(GPIO_InitStruct.gpio_periph,GPIO_InitStruct.mode,GPIO_InitStruct.pull_up_down,GPIO_InitStruct.pin);
gpio_output_options_set(GPIO_InitStruct.gpio_periph,GPIO_InitStruct.otype,GPIO_InitStruct.speed,GPIO_InitStruct.pin);
GPIO_InitStruct.gpio_periph = GPIOA;
GPIO_InitStruct.mode = GPIO_MODE_AF;
GPIO_InitStruct.pin = GPIO_PIN_10;
GPIO_InitStruct.otype = GPIO_OTYPE_PP;
GPIO_InitStruct.speed = GPIO_OSPEED_50MHZ;
GPIO_InitStruct.pull_up_down = GPIO_PUPD_PULLUP;
GPIO_InitStruct.alt_func_num=GPIO_AF_1;
gpio_af_set(GPIO_InitStruct.gpio_periph,GPIO_InitStruct.alt_func_num,GPIO_InitStruct.pin);
gpio_mode_set(GPIO_InitStruct.gpio_periph,GPIO_InitStruct.mode,GPIO_InitStruct.pull_up_down,GPIO_InitStruct.pin);
gpio_output_options_set(GPIO_InitStruct.gpio_periph,GPIO_InitStruct.otype,GPIO_InitStruct.speed,GPIO_InitStruct.pin);
}
usart.h
#ifndef __USART_H_
#define __USART_H_
#include "main.h"
typedef struct
{
uint32_t BaudRate;
uint32_t WordLength;
uint32_t StopBits;
uint32_t Parity;
uint32_t Mode;
uint32_t HwFlowCtl;
uint32_t OverSampling;
} UART_InitTypeDef;
typedef struct __UART_HandleTypeDef
{
uint32_t usart_periph;
UART_InitTypeDef Init;
} UART_HandleTypeDef;
extern UART_HandleTypeDef usart0;;
extern void My_Usart_Init(void);
extern void My_Usart_MspInit(void);
#endif
bsp_usart.c
#include "bsp_usart.h"
#include "usart.h"
#include <stdio.h>
#include <stdarg.h>
#include "string.h"
uint8_t usart0_buf[128];
uint16_t len = 0,i;
void usart0_printf(const char *fmt,...)
{
static va_list ap;
va_start(ap, fmt);
vsprintf((char *)usart0_buf, fmt, ap);
va_end(ap);
len = strlen((const char *)usart0_buf);
for(i=0;i<len;i++)
{
while (RESET == usart_flag_get(usart0.usart_periph,USART_FLAG_TC));
usart_data_transmit(usart0.usart_periph,(uint32_t)usart0_buf[i]);
}
}
uint8_t value;
void USART0_IRQHandler(void)
{
if(RESET != usart_interrupt_flag_get(usart0.usart_periph, USART_INT_FLAG_RBNE))
{
value = (uint8_t)usart_data_receive(usart0.usart_periph);
usart_interrupt_flag_clear(usart0.usart_periph,USART_INT_FLAG_ERR_FERR);
}
}
测试部分
![image.png image.png](//file.elecfans.com/web2/M00/6B/97/pYYBAGMpZm2ATaEHAADtQ_6iHwI887.jpg)
![image.png image.png](//file.elecfans.com/web2/M00/6A/FF/poYBAGMpZm6AdfAfAAHK6G5Dt2M266.jpg)
![image.png image.png](//file.elecfans.com/web2/M00/6A/FF/poYBAGMpZm2AXbGHAAFaDWn6iDM372.jpg)
其它
在编写过程中,经常报内存的错误。经过编译后,Program Size: Code=14824 RO-data=368 RW-data=160 ZI-data=7856。ROM=14.85KB,RAM=7.83KB,可怜的板子,承受了它不能承受之痛。
原作者:兆易创新GD32 MCU kings669669