基于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的高精度温度测控系统-原理图设计

资料转发分享基于STM32智能路灯灯光自动控制系统设计-基于STM32无刷电机BLDC速度控制器系统设计-基于STM32热释人体感应智能门禁报警系统设计-基于STM32居家加湿器控制仿真系统设计

毕业设计 基于STM32的语音IC卡停车管理系统

毕业设计 - 题目:基于 stm32 的病房呼叫系统

毕业设计 基于stm32舞台彩灯控制器设计app控制系统