本文为作者学习笔记
欢迎交流讨论,喜欢的话点个赞吧
欢迎去看我的主页
: NicholasYe’s Hompage.
CubeMX初始配置
- 以STM32H750为例
- CubeMX选定对应芯片生成工程文档
- 设置RCC,选定为外部时钟(根据自己的开发板选择!外部时钟可以提供高速振源)
- 根据外设设定芯片引脚
- 配置输出
需注意:目录必须全英文
- Generate Code!
Keil点亮LED灯及输出PWM
点亮LED灯
HAL中设置GPIO:
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
/*Configure GPIO pin : PA1 */
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
闪烁:
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5, GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5, GPIO_PIN_SET);
HAL_Delay(500);
输出PWM点亮呼吸灯
- 输出PWM前需要在CubeMX中配置时钟
具体时钟调法可参考:CSDN
GPIO.h文件中:
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(timHandle->Instance==TIM5)
{
/* USER CODE BEGIN TIM5_MspPostInit 0 */
/* USER CODE END TIM5_MspPostInit 0 */
__HAL_RCC_GPIOA_CLK_ENABLE();
/**TIM5 GPIO Configuration
PA1 ------> TIM5_CH2
*/
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM5;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN TIM5_MspPostInit 1 */
/* USER CODE END TIM5_MspPostInit 1 */
}
}
输出PWM:
int main(void)
{
/* USER CODE BEGIN 1 */
uint16_t dutyCycle=0;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM5_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim5,TIM_CHANNEL_2);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
/* USER CODE BEGIN WHILE */
while (dutyCycle < 1000)
{
dutyCycle ++;
__HAL_TIM_SET_COMPARE(&htim5, TIM_CHANNEL_2, dutyCycle);
// TIM3->CCR2 = dutyCycle;
HAL_Delay(5);
}
while (dutyCycle > 0)
{
dutyCycle --;
__HAL_TIM_SET_COMPARE(&htim5, TIM_CHANNEL_2, dutyCycle);
// TIM3->CCR2 = dutyCycle;
HAL_Delay(5);
}
HAL_Delay(200);
}
/* USER CODE END 3 */
}
输出PWM部分可参考:
配置外部中断
中断的概念:
中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行
中断优先级:
- 值越低,越优先,越先反应;优先值相同,不发生抢占
- 抢占优先级相同时,子优先级高的先行
- 若抢占优先级及子优先级均相同,IRQ编号小的先行(CubeMX配置的Keil文件中的system_stm32xxxx.h中可以找到)
嵌套向量中断控制器(NVIC)功能:
事件的概念:
- STM32上许许多多的外设,是通过内部信号来协同工作的。这个信号,可以理解为事件。
- 事件---->中断 事件---->中断
CubeMX配置
- GPIO中选择引脚模式
- GPIO选择触发模式
具体触发模式详解可看:B站 - NVIC中配置具体的优先级并选择启动外部中断
注意:
- Priority Group中选择中断优先级种类
- Preemption Priority与Sub Priority为抢占优先级和子优先级(顺序前文有提到)
- 记得点Enabled!
- Generate Code!
GPIO.h文件中:
/*Configure GPIO pin : PE3 */
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI3_IRQn, 4, 0);
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
请在转载文章过程中明确标注文章出处!尊重原创,尊重知识产权,谢谢!