系统时钟的配置参考:基于HAL库的STM32H7工程开发系列教程二《配置系统时钟》 在工程中添加对应的外设源文件和头文件,并把头文件路径添加到工程中 LED灯的配置,通用GPIO的配置比较简单,配置下输出模式和对应引脚端口就好,不多介绍
#include "bsp_led.h"
void BSP_LED_Init(void)
{
GPIO_InitTypeDef GPIO_Instructure = {0};
LED_R_CLK_ENABLE();
GPIO_Instructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Instructure.Pin = LED_R_PIN;
GPIO_Instructure.Pull = GPIO_NOPULL;
GPIO_Instructure.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LED_R_PORT,&GPIO_Instructure);
}
#ifndef __BSP_LED_H
#define __BSP_LED_H
#ifdef __cplusplus
extern "C" {
#endif
#include "stm32h7xx_hal.h"
#define LED_R_PORT GPIOB
#define LED_R_PIN GPIO_PIN_0
#define LED_R_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
void BSP_LED_Init(void);
#ifdef __cplusplus
}
#endif
#endif
配置串口,串口本次使用的是异步通信 串口的配置不光要配置GPIO外设,还要配置USART外设 具体的配置代码如下:
#include "bsp_uart.h"
#include "stdio.h"
UART_HandleTypeDef huart1;
void BSP_UART_Init(void)
{
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
GPIO_InitTypeDef GPIO_Instructure = {0};
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1;
PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
;
}
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_Instructure.Alternate = GPIO_AF7_USART1;
GPIO_Instructure.Mode = GPIO_MODE_AF_PP;
GPIO_Instructure.Pin = GPIO_PIN_10|GPIO_PIN_9;
GPIO_Instructure.Pull = GPIO_PULLUP;
GPIO_Instructure.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA,&GPIO_Instructure);
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if(HAL_UART_Init(&huart1) != HAL_OK)
{
;
}
if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
{
;
}
if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
{
;
}
if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
{
;
}
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
}
int fputc(int ch,FILE *f)
{
uint16_t timeout = 0;
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF);
while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC) != SET)
{
timeout++;
if(timeout >= 1000)
{
break;
}
}
return ch;
}
#ifndef __BSP_UART_H
#define __BSP_UART_H
#ifdef __cplusplus
extern "C" {
#endif
#include "stm32h7xx_hal.h"
void BSP_UART_Init(void);
#ifdef __cplusplus
}
#endif
#endif
PeriphClkInitStruct.Usart16ClockSelection =RCC_USART16CLKSOURCE_D2PCLK2; 这个为什么选择PCLK2,也可以选择其他的,可选择的有如下几种结果: 对应程序中选择的项如下:RCC_USART16CLKSOURCE_D2PCLK2是系统默认的配置 GPIO_Instructure.Pull = GPIO_PULLUP;按照官方给的指导设置成上拉 其他参数比较常用,按自己需求配置 由于系统默认的终端优先组是4,所以再不修改中断优先组的情况下,只用配置朱优先级和子优先级就好了 中断优先级和组之间的关系(数目越小优先级越高) 以上设置完成之后在主函数中添加初始化代码和测试代码如下:
#include "main.h"
int main(void)
{
BSP_Init();
while(1)
{
printf("这是一个串口测试程序:欢迎来到STM32的世界!\r\n");
HAL_Delay(1000);
HAL_GPIO_TogglePin(LED_R_PORT,LED_R_PIN);
}
}
void BSP_Init(void)
{
HAL_Init();
Debug_Clock_Enable();
SystemClock_Config();
BSP_LED_Init();
BSP_UART_Init();
}
void SysTick_Handler(void)
{
HAL_IncTick();
}
#ifndef __MAIN_H
#define __MAIN_H
#ifdef __cplusplus
extern "C" {
#endif
#include "stm32h7xx_hal.h"
#include "stdio.h"
#include "systemclock.h"
#include "bsp_led.h"
#include "bsp_uart.h"
void BSP_Init(void);
#ifdef __cplusplus
}
#endif
#endif
在使用printf函数时候要包含stdio.h这个头文件,并在keil配置中勾选如下功能 将程序下载到开发板,正常情况下是LED灯闪烁,串口定时输出数据,但是串口可能会出现以下错误 以上出现的中文乱码,一些电脑是不会出错的,这个好像和电脑系统版本有关系(系统升级后出现才出现错的,之前老版本没有乱码现象)如果出现了这个错误该如何解决呢? 使用到printf函数的文件用记事本打开 将编码格式保存成ANSI格式就好了 下一章配外部SDRAM
|