一、GPIO
1.选择调试类型
在SYS中Debug选择Serial Wire模式
2.选择时钟源
在RCC中将HSE和LSH都选择为内部晶振
3.时钟树配置
4.GPIO配置
在芯片图上选择开启的引脚和其功能
配置引脚的各自属性
5.工程文件配置
配置工程文件的名字,位置等
Toolchain/IDE:选择用于调试的工具,生成对应的文件
选择“仅添加重要库”和“生成对应.c/.h文件”,最后点击GENERATE CODE生成文件
二、中断系统
1.选择调试类型
在SYS中Debug选择Serial Wire模式
2.选择时钟源
在RCC中将HSE和LSH都选择为内部晶振
3.时钟树配置
4.GPIO配置
引脚的复用选择
引脚属性的配置
5.NVIC的配置
引脚开启NVIC
配置中断的优先级
6.工程文件配置
配置工程文件的名字,位置等
选择“仅添加重要库”和“生成对应.c/.h文件”,最后点击GENERATE CODE生成文件
7.重写回调函数
重写中断服务函数中调用的回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_10)
{
HAL_Delay(15);
// 防抖: 延迟15ms之后再次检测是否仍然是高电平,
if (HAL_GPIO_ReadPin(GPIOF, GPIO_Pin) == GPIO_PIN_SET)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);
}
}
}
三、USART串口通信
1.选择调试类型
在SYS中Debug选择Serial Wire模式
2.选择时钟源
在RCC中将HSE和LSH都选择为内部晶振
3.时钟树配置
4.USART配置
通过开启USART功能,HAL库能自动配置相应的GPIO
属性配置
开启中断
5.工程文件配置
配置工程文件的名字,位置等
选择“仅添加重要库”和“生成对应.c/.h文件”,最后点击GENERATE CODE生成文件
6.重写回调函数
uint8_t rxBuff[1000]; // 接收缓冲区
// Size 是实际接收的数据的长度
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if (huart1.Instance == USART1)
{
HAL_UART_Transmit(&huart1, rxBuff, Size, HAL_MAX_DELAY);
HAL_UARTEx_ReceiveToIdle_IT(&huart1, rxBuff, 1000);
}
}
四、I2C通信
1.选择调试类型
在SYS中Debug选择Serial Wire模式
2.选择时钟源
在RCC中将HSE和LSH都选择为内部晶振
3.时钟树配置
4.I2C配置
I2C选择为I2C
5.I2C发送和读取
//ADDR为该外设模块的读取指令地址
#define ADDR 0xA0
uint8_t innerAddr = 0x00;
//I2C初始配置
MX_I2C2_Init();
//向0x00地址中写入
HAL_I2C_Mem_Write(&hi2c2,ADDR,innerAddr,I2C_MEMADD_SIZE_8BIT, &byte, 1, 2000);
//读取0x00地址中
HAL_I2C_Mem_Read(&hi2c2, ADDR + 1, innerAddr, I2C_MEMADD_SIZE_8BIT, &byte, 1, 2000);
五、定时器
1.选择调试类型
在SYS中Debug选择Serial Wire模式
2.选择时钟源
在RCC中将HSE和LSH都选择为内部晶振
3.时钟树配置
4.通用定时器配置
5.工程文件配置
配置工程文件的名字,位置等
选择“仅添加重要库”和“生成对应.c/.h文件”,最后点击GENERATE CODE生成文件
6.定时器运用
使用通用定时器不断改变PWM的占空比,可以实现呼吸灯等效果
//添加修改占空比的函数
void setDutyCycle(uint16_t dutyCycle)
{
// 设置捕获比较寄存器的值
__HAL_TIM_SetCompare(&htim5, TIM_CHANNEL_2, dutyCycle);
}
void main(){
MX_TIM5_Init();
HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_2);
uint8_t dutyCycle = 1;
int8_t step = 1;
while (1)
{
if (dutyCycle <= 0 || dutyCycle >= 99)
{
step = -step;
}
dutyCycle += step;
setDutyCycle(dutyCycle);
HAL_Delay(10);
}
}