目錄
- 一、GPIO
- 二、中斷系統
- 三、USART串口通信
- 四、I2C通信
- 五、定時器
一、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);}
}