基于STM32的外围系统设计
Posted T4b3_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于STM32的外围系统设计相关的知识,希望对你有一定的参考价值。
实现需求
前言
期末太忙,有空再写
总体框架
CUBEMX初始化
配置DMA
配置按键和LED
配置DAC
TIM6负责DAC
TIM10负责PWM
时钟树配置
关键代码
LED流水灯
可由按键调整启用LED数量,上下限1-10个
void FlowLED(int n){
for(int i=0;i!=n;i++){
switch(i){
case 0:
HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_SET);
HAL_Delay(100);
break;
case 1:
HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
HAL_Delay(100);
break;
case 2:
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET);
HAL_Delay(100);
break;
case 3:
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin,GPIO_PIN_SET);
HAL_Delay(100);
break;
case 4:
HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED4_GPIO_Port,LED4_Pin,GPIO_PIN_SET);
HAL_Delay(100);
break;
case 5:
HAL_GPIO_WritePin(LED4_GPIO_Port,LED4_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED5_GPIO_Port,LED5_Pin,GPIO_PIN_SET);
HAL_Delay(100);
break;
case 6:
HAL_GPIO_WritePin(LED5_GPIO_Port,LED5_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED6_GPIO_Port,LED6_Pin,GPIO_PIN_SET);
HAL_Delay(100);
break;
case 7:
HAL_GPIO_WritePin(LED6_GPIO_Port,LED6_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED7_GPIO_Port,LED7_Pin,GPIO_PIN_SET);
HAL_Delay(100);
break;
case 8:
HAL_GPIO_WritePin(LED7_GPIO_Port,LED7_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED8_GPIO_Port,LED8_Pin,GPIO_PIN_SET);
HAL_Delay(100);
break;
case 9:
HAL_GPIO_WritePin(LED8_GPIO_Port,LED8_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED9_GPIO_Port,LED9_Pin,GPIO_PIN_SET);
HAL_Delay(100);
break;
}
if(flow_flag)ShowStr(mov);
}
for(int i=n-1;i>-1;i--){
switch(i){
case 0:
HAL_GPIO_WritePin(LED8_GPIO_Port,LED8_Pin,GPIO_PIN_RESET);
HAL_Delay(100);
break;
case 1:
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_SET);
HAL_Delay(100);
break;
case 2:
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
HAL_Delay(100);
break;
case 3:
HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET);
HAL_Delay(100);
break;
case 4:
HAL_GPIO_WritePin(LED4_GPIO_Port,LED4_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin,GPIO_PIN_SET);
HAL_Delay(100);
break;
case 5:
HAL_GPIO_WritePin(LED5_GPIO_Port,LED5_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED4_GPIO_Port,LED4_Pin,GPIO_PIN_SET);
HAL_Delay(100);
break;
case 6:
HAL_GPIO_WritePin(LED6_GPIO_Port,LED6_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED5_GPIO_Port,LED5_Pin,GPIO_PIN_SET);
HAL_Delay(100);
break;
case 7:
HAL_GPIO_WritePin(LED7_GPIO_Port,LED7_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED6_GPIO_Port,LED6_Pin,GPIO_PIN_SET);
HAL_Delay(100);
break;
case 8:
HAL_GPIO_WritePin(LED8_GPIO_Port,LED8_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED7_GPIO_Port,LED7_Pin,GPIO_PIN_SET);
HAL_Delay(100);
break;
case 9:
HAL_GPIO_WritePin(LED9_GPIO_Port,LED9_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED8_GPIO_Port,LED8_Pin,GPIO_PIN_SET);
HAL_Delay(100);
break;
}
if(flow_flag)ShowStr(mov);
}
}
广告屏滚动字幕
void ShowStr(int t){
LCD_Clear(WHITE);
LCD_ShowString(t,40,500,24,24,"STUDENT NUMBER : 19081516"); //长度25*24=600
LCD_ShowString(t+50,70,500,24,24,"NAME : Li Tianyu"); //长度16*24=400
LCD_ShowString(t+53,100,200,24,24,"GROUP : Unknown"); //长度15*24=376
if(mov>=480)mov=0;
else mov+=15;
}
启用PWM
HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);
按键外部中断函数
此函数放于gpio.c下
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
extern int n;
int pulse;
extern int flow_flag;
extern int wave_flag;
extern int freq;
switch(GPIO_Pin){
case KEY0_Pin: //判断KEY0
delay_ms(10); //消抖
if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==0 && HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin)==0){
if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==1){ //减少灯
if(n>1)n--;
flow_flag=1;
//LCD_Clear(WHITE);
//sprintf((char*)led,"LED NUMBER: %02d",n);
//LCD_ShowString(100,40,500,24,24,led);
}
}
else if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==1){
if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==1){
flow_flag=0;
STMFLASH_Read(FLASH_SAVE_ADDR,(u32 *)comp,SIZE);
sscanf((char*)comp,"%d",&pulse);
if(pulse>40) pulse-=42;
__HAL_TIM_SET_COMPARE(&htim10,TIM_CHANNEL_1,pulse); //降低占空比
sprintf((char*)comp,"%d",pulse);
STMFLASH_Write(FLASH_SAVE_ADDR,(u32 *)comp,SIZE);
sprintf((char*)comp,"PWM:%d %%",pulse*100/840);
LCD_Clear(WHITE);//清除半屏
LCD_ShowString(100,40,500,24,24,(u8 *)comp);
delay_ms(100);
}
}
else if(HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin)==1) {
if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==1){ //提高频率 步长100
if(freq<10000)freq+=100;
int reload=84000000/256/freq-1;
__HAL_TIM_SET_AUTORELOAD(&htim6,reload);
sprintf((char *)fre,"Frequence: %d",84000000/256/(reload+1));
LCD_Clear(WHITE);
LCD_ShowString(100,40,500,24,24,(u8 *)fre);
}
}
break;
case KEY1_Pin: //判断KEY1
delay_ms(10); //消抖
if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==0 && HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin)==0){
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==1){ //增加灯
if(n<10)n++;
flow_flag=1;
//LCD_Clear(WHITE);
//sprintf((char*)led,"LED NUMBER: %02d",n);
//LCD_ShowString(100,40,500,24,24,led);
}
}
else if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==1){
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==1){
flow_flag=0;
STMFLASH_Read(FLASH_SAVE_ADDR,(u32 *)comp,SIZE);
sscanf((char*)comp,"%d",&pulse);
if(pulse<800) pulse+=42;
__HAL_TIM_SET_COMPARE(&htim10,TIM_CHANNEL_1,pulse); //降低占空比
sprintf((char*)comp,"%d",pulse);
STMFLASH_Write(FLASH_SAVE_ADDR,(u32 *)comp,SIZE);
sprintf((char*)comp,"PWM:%d %%",pulse*100/840);
LCD_Clear(WHITE);//清屏
LCD_ShowString(100,40,500,24,24,(u8 *)comp);
delay_ms(100);
}
}
else if(HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin)==1) {
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==1){ //降低频率 步长100
if(freq>800)freq-=100;
int reload=84000000/256/freq-1;
__HAL_TIM_SET_AUTORELOAD(&htim6,reload);
sprintf((char *)fre,"Frequence: %d",84000000/256/(reload+1));
LCD_Clear(WHITE);
LCD_ShowString(100,40,500,24,24,(u8 *)fre);
}
}
break;
case KEY2_Pin:
delay_ms(10);
LCD_Clear(WHITE);
LCD_ShowString(100,40,500,24,24,(char *)"Setting PWM!"); //KEY2对应pwm占空比设置
break;
case KEY3_Pin:
delay_ms(10);
flow_flag=0;
LCD_Clear(WHITE);
wave_flag=(wave_flag+1)%4;
switch(wave_flag){
case 0: //0对应方波
HAL_DAC_Stop_DMA(&hdac,DAC_CHANNEL_1);
HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1, (uint32_t*)square_8bit, 256, DAC_ALIGN_8B_R);
LCD_ShowString(100,40,500,24,24,(char *)"Square Wave Generating!");
break;
case 1: //1对应三角波
HAL_DAC_Stop_DMA(&hdac,DAC_CHANNEL_1);
HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1, (uint32_t*)triangle_8bit, 256, DAC_ALIGN_8B_R);
LCD_ShowString(100,40,500,24,24,(char *)"Triangle Wave Generating!");
break;
case 2: //2对应正弦波
HAL_DAC_Stop_DMA(&hdac,DAC_CHANNEL_1);
HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1, (uint32_t*)sine_8bit, 256, DAC_ALIGN_8B_R);
LCD_ShowString(100,40,500,24,24,(char *)"Sine Wave Generating!");
break;
case 3: //3对应锯齿波
HAL_DAC_Stop_DMA(&hdac,DAC_CHANNEL_1);
HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1, (uint32_t*)sawtooth_8bit, 256, DAC_ALIGN_8B_R);
LCD_ShowString(100,40,500,24,24,(char *)"Sawtooth Wave Generating!");
break;
}
}
}
主函数
int main(void)
{
/* USER CODE BEGIN 1 */
char comp[20];
int pulse=420-1;
u16 adcx;
extern uint32_t frequency_measure;
extern uint32_t cnt_TIM5;
extern uint8_t TIM5CH2_CAPTURE_STA;
float temp;
/* 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_GPI以上是关于基于STM32的外围系统设计的主要内容,如果未能解决你的问题,请参考以下文章
资料转发分享基于STM32智能路灯灯光自动控制系统设计-基于STM32无刷电机BLDC速度控制器系统设计-基于STM32热释人体感应智能门禁报警系统设计-基于STM32居家加湿器控制仿真系统设计