环境配置
在CubeMx Pinout view 中点击可以设置管脚模式 ,右击 可以配置管脚名称
这里以点PB8灯为例,可以设置灯输出电平 ,模式为输出,不进行上下拉, 速度 模式设置以及用户自定义名称。。
时钟树配置,使用HSI 时钟并进行pll,倍频到最大频率 64MHz
输出配置不进行分开,所有初始化都在main函数实现,方便后续工程配置变化,不用在keil 中进行文件添,然后点击右上角的生成,生成代码。
代码解析
所有自定义名称配置均在main.h
生成的 gpio配置在 main.c 中,此部分在main 函数中已经调用,不用在bsp中进行重新调用设置
LED Bsp 代码 实现
#ifndef APPLICATIONS_LED_H_
#define APPLICATIONS_LED_H_
#include "main.h"
//#define LED_Pin GPIO_PIN_8
//#define LED_GPIO_Port GPIOB
#define LED(x) do{ x ? \
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET) : \
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET); \
}while(0)
#define LED_TOGGLE() do{ HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); }while(0)
#endif /* APPLICATIONS_LED_H_ */
直接引用main.h 然后进行定义开关即可,比较方便。
Delay 实现
#include "delay.h"
#include "main.h"
static uint16_t g_fac_us = 0;
/**
* @brief systick init
* @param sysclk uint = MHz
* @retval void
*/
void delay_init(uint16_t sysclk)
{
SysTick->CTRL = 0; //disable systick states
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);//use sysclk/8
g_fac_us = sysclk / 8; //1us count number
}
void delay_us(uint32_t nus)
{
uint32_t temp;
SysTick->LOAD = nus * g_fac_us; //time add
SysTick->VAL = 0x00; //clear count
SysTick->CTRL |= 1 << 0 ; //start count
do
{
temp = SysTick->CTRL;
} while ((temp & 0x01) && !(temp & (1 << 16))); /* CTRL.ENABLEλ±ØÐëΪ1, ²¢µÈ´ýʱ¼äµ½´ï */
SysTick->CTRL &= ~(1 << 0) ; //disable systick
SysTick->VAL = 0X00; //clear count
}
/**
* @brief delay nms
* @param nms: (0< nms <= 65535)
*/
void delay_ms(uint16_t nms)
{
uint32_t repeat = nms / 1000;
uint32_t remain = nms % 1000;
while (repeat)
{
delay_us(1000 * 1000); //1s delay
repeat--;
}
if (remain)
{
delay_us(remain * 1000); // delay less 1s remain ms
}
}
使用时在main 函数 初始化加上
delay_init(64);
如上图cubeMX 设置,系统时钟最大为64MHz,按us算,64 count 为1us,输入64即可。
然后就可以愉快的点灯了
delay_init(64);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
LED_TOGGLE();
delay_ms(1000);
}
/* USER CODE END 3 */
注意加代码必须在注释的范围内添加,不然重新生成代码时,会将写的代码删除(包括头文件include 定义 代码编写等等