ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

STM32的一些基础硬件

STM32的一些基础硬件 一、通用配置与声明STM32的一些通用设置文中所有引脚是按照我自己的芯片的读者可以根据自己的芯片原理图改动二、LED灯光1、在CubeMX的芯片俯视图中找到PB5和PE5左键并选择GPIO_Output右键并设置User Label,如LED12、完成其他的基础配置3、在生成代码后找到While(1)循环准备输入程序4、代码HAL_GPIO_WritePin(LED1_GPIO_Port,LED0_Pin,GPIO_PIN_RESET);//-高电平 HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);//-低电平 HAL_GPIO_TogglePin(LED1_PORT, LED1_PIN);//反转状态 HAL_Delay(500);//-延时500msSET高电平3.3V / 5V1GPIO_PIN_SETRESET低电平0V / GND0GPIO_PIN_RESET5、代码的简化在开头定义宏即可#define LED_ON() HAL_GPIO_WritePin(LED1_PORT, LED1_PIN, GPIO_PIN_RESET) // 低电平点亮 #define LED_OFF() HAL_GPIO_WritePin(LED1_PORT, LED1_PIN, GPIO_PIN_SET) #define LED_TOGGLE() HAL_GPIO_TogglePin(LED1_PORT, LED1_PIN)6、呼吸灯的搭建6.1、原理利用PWM输出高频波改变LED灯的占空比以改变其亮度6.2、CubeMX配置左侧 Timers → 点击 TIM3Clock Source选 Internal ClockChannel2选 PWM Generation CH2Parameter Settings 标签页Prescaler71972MHz / (7191) 100kHzCounter Period999100kHz / 999 ≈ 100Hz PWM频率Pulse0初始占空比0CH PolarityHigh高电平有效初学时直接套用这些设置即可定时器时钟72 MHzTIM3 挂在 APB1 总线上APB1 72MHzPrescaler预分频器71972MHz / (719 1) 100 kHz即计数器每 10μs 加 1Counter Period自动重装载值999100kHz / (999 1) 100 Hz→ 周期 10msPWM 频率100 Hz适合 LED 调光人眼无闪烁占空比分辨率0~999共 1000 级Pulse值从 0 到 999对应 0%~100%Prescaler 719将 72MHz 降到 100kHz让计数器跑得“慢一点”便于用 0~999 表示 1000 级占空比Counter Period 999得到 100Hz 的 PWM 频率高于人眼分辨能力约 60HzLED 看起来是“连续调光”而不是“闪烁”Pulse 0初始占空比为 0%LED 默认熄灭防止上电瞬间全亮CH Polarity High高电平有效占空比越大平均电压越高LED 越亮6.3代码//放在User Code Begin2 HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_2);//放在while(1)中 for (uint16_t duty 0; duty 1000; duty 10){ __HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_2, duty); HAL_Delay(15); } for (uint16_t duty 999; duty 0; duty - 10){ __HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_2, duty); HAL_Delay(15); }三、按键1、在CubeMX的芯片俯视图中找到PE3和PE4左键并选择GPIO_Input右键并设置User Label,如KEY0和KEY12、在System Core - GPIO 中间的框GPIO Pull-up/Pull-down中选择Pull-up(Pull-down也行)未按下按下Pull-up高电平低电平Pull-down低电平高电平3、代码if (HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) GPIO_PIN_RESET) // 按键被按下低电平 { HAL_Delay(20); // 简单消抖 if (HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) GPIO_PIN_RESET) { // 按键确实被按下了执行动作 HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET); // LED亮 while(HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) GPIO_PIN_RESET); // 等待松手 } }4、简化#define KEY0_PRESSED() (HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) GPIO_PIN_RESET)四、蜂鸣器1、在CubeMX的芯片俯视图中找到PB8左键并选择GPIO_Output右键并设置User Label,如BEEP2、代码HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,GPIO_PIN_SET); HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,GPIO_PIN_RESET);五、串口输出1、Connectivity - USART1Mode勾选Asynchronous确认Parameter SettingsBaud Rate 115200Word Length 8 BitsParity NoneStop Bits 12、printf重定向//放在main.c的USER CODE BEGIN 0 #include stdio.h int fputc(int ch, FILE *f) { HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, 0xFFFF); return ch; }3、程序中用printf输出即可4、打开sscom.exe(自己下载或者正点原子官方的资源中有),选择端口设备管理器中查找端口号波特率为115200打开串口即可查看输出六、光敏传感器1、Analog -ADC3,Mode选择IN6,芯片俯视图中PF8左键选择ADC3_IN6,右键编辑User_Label2、代码HAL_ADC_Start(hadc3);//启动 if (HAL_ADC_PollForConversion(hadc3, 100) HAL_OK) { uint32_t adc_value HAL_ADC_GetValue(hadc3); printf(光敏值: %d\r\n, adc_value); } else { printf(ADC 转换超时\r\n); // 调试时便于定位 } HAL_ADC_Stop(hadc3);//停止 //HAL_ADC_PollForConversion(hadc3, 100) //等待转换完成超时时间 100ms。 //返回 HAL_OK转换完成可以读取数据。 //返回 HAL_TIMEOUT超时ADC 没完成转换。七、基本定时器1、Timer中选择TIM6/TIM7,Clock Source选择Internal ClockAPB12、根据需要设置Parameter Settings并使能TIM6中断3、代码//开启定时器 HAL_TIM_Base_Start_IT(htim6); //中断回调函数 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim-Instance TIM6) // 判断是 TIM6 触发的中断 { HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin); // 翻转 LED0 } }
返回列表