【蓝桥杯】基于STM32G431模块总结

server/2024/9/23 18:29:38/

目录

 一.LED部分

二.按键部分 

三.ADC部分 

四.基于IIC的24c02读写部分(EEPROM)

 五.LCD显示部分

 六.定时器部分

1.定时器中断回调

2. PWM输出改变频率和占空比

3.输入捕获测量占空比和频率(利用主从模式) 

 4.方波输出回调

七.RTC部分


 一.LED部分


uint8_t ucled;void LED_Disp(uint8_t ucLed)
{/***将所有的灯熄灭***/HAL_GPIO_WritePin(GPIOC,0xff00, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIdouN_RESET);/***根据ucLed的数值点亮相应的灯***/HAL_GPIO_WritePin(GPIOC, ucLed<<8, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);		
}
/***使用 |= 和 &= 在更改指定led时不会影响到其他led***/if (led1_flag) { 	/***LED1常亮***/ucled |= 0x01;}else {	/***有开就要有关,不然亮了关不掉***/ucled &= ~0x01;}
/***led以某一频率闪烁***/if (uwTick - ledTick < 500) return;ledTick = uwTick;if (flag) {  //以某频率闪烁 (0.5s)  ucled ^= 0x02;}else {ucled &= ~0x02;}/***led亮几秒后熄灭
某种情况flag = 1 后 
cnt = 0;
***/if (flag) {  //点亮几秒后熄灭 (5s)ucled |= 0x04;}else {ucled &= ~0x04;}
//SysTick_Handler函数
{cnt++;if (cnt == 5000) {flag = 0;}
}/***led流水灯***/
//led处理程序if (led_flag) {  //led流水灯 (0.2s)  5-8ucled |= ( 0x10 << led);}else{ucled &= ~( 0x10 << led);}//SysTick_Handler函数
{led_cnt++;if (led_cnt == 200) {   //0.2sled1_cnt = 0;if (led == 3) {led = 0;}else {led++;}}
}void Led_Proc(void)
{if((uwTick -  uwTick_Led_Set_Point)<200)	return;uwTick_Led_Set_Point = uwTick;LED_Disp(ucLed);
}

二.按键部分 


uint8_t Key_Scan(void)
{uint8_t unKey_Val = 0;if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET)unKey_Val = 1;if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET)unKey_Val = 2;if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == GPIO_PIN_RESET)unKey_Val = 3;if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)unKey_Val = 4;	return unKey_Val;
}
uint8_t ucKey_Val, unKey_Down, ucKey_Up, ucKey_Old;void Key_Proc(void)
{if((uwTick -  uwTick_Key_Set_Point)<50)	return;uwTick_Key_Set_Point = uwTick;ucKey_Val = Key_Scan();unKey_Down = ucKey_Val & (ucKey_Old ^ ucKey_Val); ucKey_Up = ~ucKey_Val & (ucKey_Old ^ ucKey_Val);	ucKey_Old = ucKey_Val;switch(key_down){case 1:uwTick_key_long_short = uwTick ;}if(key_up == 1){if((uwTick -uwTick_key_long_short) > 2000)//长按{}else//短按{}}}

三.ADC部分 

/***校准函数***/
HAL_ADCEx_Calibration_Start(&hadc)double get_adc(ADC_HandleTypeDef *pin)
{uint32_t adc_val;HAL_ADC_Start(pin);adc_val=HAL_ADC_GetValue(pin);return adc_val*3.3/4096;
}


四.基于IIC的24c02读写部分(EEPROM)

/***写***/
void iic_24c02_write(uint8_t *pucBuf, uint8_t ucAddr, uint8_t ucNum)
{I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(ucAddr);	I2CWaitAck();while(ucNum--){I2CSendByte(*pucBuf++);I2CWaitAck();	}I2CStop();delay1(500);	
}
/***读***/
void iic_24c02_read(uint8_t *pucBuf, uint8_t ucAddr, uint8_t ucNum)
{I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(ucAddr);	I2CWaitAck();I2CStart();I2CSendByte(0xa1);I2CWaitAck();while(ucNum--){*pucBuf++ = I2CReceiveByte();if(ucNum)I2CSendAck();	elseI2CSendNotAck();}I2CStop();	
}

 五.LCD显示部分

/***屏幕只能显示20,再加一个\0***/
uint8_t lcd_disp[21];
void Lcd_Proc(void)
{if((uwTick -  uwTick_Lcd_Set_Point)<100)	return;uwTick_Lcd_Set_Point = uwTick;sprintf((char *)Lcd_Disp_String, "TEST CODE:%02X",ucLed);LCD_DisplayStringLine(Line9, Lcd_Disp_String);			}

六.串口部分

//串口部分
void Usart_Proc(void)
{if((uwTick -  uwTick_Usart_Set_Point)<1000)	return;uwTick_Usart_Set_Point = uwTick;}
/*串口1  PA9--TX PA10--RX
Asynchronous 异步 
synchronous 同步
接收中断要先打开
*/
HAL_UART_Receive_IT(&huart1,&rxdat,1);char rxdata[30];
uint8_t rxdat;
uint8_t  rx_pointer;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *hurat)
{rxdata[rx_pointer++]=rxdat;HAL_UART_Receive_IT(&huart1,&rxdat,1);
}

 六.定时器部分

1.定时器中断回调


/***
定时器中断回调
要先使能中断
***/
HAL_TIM_Base_Start_IT(&htim6);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM6){if(++counter == 10){counter = 0;sprintf(str, "Hello,world.\r\n");HAL_UART_Transmit(&huart1,(unsigned char *)str, strlen(str), 50);	}}HAL_TIM_Base_Start_IT(&htim6);
}

2. PWM输出改变频率和占空比

/***PWM输出***/
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);	//PA6
HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);		//PA7/***改变频率或者占空比***/
__HAL_TIM_PRESCALER ();//设置预分频系数,定时器工作的频率
__HAL_TIM_SET_AUTORELOAD() //在运行时改变ARR的值,改变波形周期和频率
_HAL_TIM_SetCompare (&htim3,TIM_CHANNEL_1,100);//设置占空比,即CCR

3.输入捕获测量占空比和频率(利用主从模式) 

/***输入捕获测量占空比和频率***/
/***
因为f = 1000000/一个周期计数
所以f = 1000000/PWM_T_Count
duty = t/T
slave mode:  reset  触发后自动清零
trigger:channel 1 TI1FP1
trigger:channel 2 TI1FP2
要先使能捕获中断
***/
HAL_TIM_Base_Start(&htim2); 
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);		 
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);		
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM2){if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){PWM_T_Count =  HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1)+1;PWM_Duty = (float)PWM_D_Count/PWM_T_Count;}else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2){PWM_D_Count =  HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2)+1;}			}	
}

 4.方波输出回调

/***方波输出回调函数***/HAL_TIM_OC_Start_IT(&htim15,TIM_CHANNEL_1);
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM15){if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){			__HAL_TIM_SET_COMPARE(htim,TIM_CHANNEL_1,(__HAL_TIM_GetCounter(htim)+500));//1Khz}}
}

七.RTC部分

//RTC部分
/***
必须两个都要读取,先时间后日期
使用外部时钟分频系数为125、6000
***/extern RTC_HandleTypeDef hrtc;RTC_TimeTypeDef H_M_S_Time;
RTC_DateTypeDef Y_M_D_Date;HAL_RTC_GetTime(&hrtc, &H_M_S_Time, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &Y_M_D_Date, RTC_FORMAT_BIN);


http://www.ppmy.cn/server/30197.html

相关文章

J2EE模式

系列文章目录 J2EE模式特别关注表示层&#xff0c;这些模式是由 Sun Java Center 鉴定的&#xff0c; 包括&#xff1a; 1、 MVC模式&#xff08;MVCPattern&#xff09;&#xff1b; 2、 业务代表模式&#xff08;BusinessDelegatePattern&#xff09;&#xff1b; 3、 组合…

本地大语言模型LLM的高效运行专家 | Ollama

Ollama简介 Ollama是一个开源的大型语言模型服务工具&#xff0c;它帮助用户快速在本地运行大模型。通过简单的安装指令&#xff0c;用户可以执行一条命令就在本地运行开源大型语言模型&#xff0c;如Llama 2。Ollama极大地简化了在Docker容器内部署和管理LLM的过程&#xff0…

Facebook的语言学:社交媒体如何影响我们的沟通方式

1. 引言 社交媒体已经成为人们日常生活中不可或缺的一部分&#xff0c;而Facebook作为其中最具影响力的平台之一&#xff0c;不仅改变了人们之间的社交方式&#xff0c;也对我们的语言学产生了深远的影响。本文将深入探讨Facebook的语言学特点&#xff0c;以及它如何塑造和改变…

Golang | Leetcode Golang题解之第64题最小路径和

题目&#xff1a; 题解&#xff1a; func minPathSum(grid [][]int) int {if len(grid) 0 || len(grid[0]) 0 {return 0}rows, columns : len(grid), len(grid[0])dp : make([][]int, rows)for i : 0; i < len(dp); i {dp[i] make([]int, columns)}dp[0][0] grid[0][0]…

KCF算法的优缺点是什么

KCF算法&#xff08;Kernelized Correlation Filters&#xff09;是一种用于目标跟踪的算法&#xff0c;它结合了核技巧和相关滤波器的思想&#xff0c;可以在视频中跟踪运动目标。以下是KCF算法的主要优缺点&#xff1a; 优点&#xff1a; 速度快&#xff1a;KCF算法使用离散…

代码18-29

accreds库——utf8字符集——utf8_general_ci排序规则 先创建库&#xff0c;再去使用下列的DDL语句。 DDL 18 CREATE TABLE jiao_datas (id int(11) NOT NULL AUTO_INCREMENT COMMENT 自增ID,catId int(11) NOT NULL DEFAULT 0 COMMENT 分类id,dataName varchar(255) NOT NU…

识蒸馏十大关键概念详解:从教师-学生范式到模型压缩和重生网络

知识蒸馏(Knowledge Distillation)任务通常会使用以下术语和表述: Knowledge Distillation (KD): 知识蒸馏的直接称呼,指从一个大型复杂的教师模型(teacher model)中提取知识,并传递给一个小型简单的学生模型(student model)的过程。Teacher-Student Framework: 教师-学生框架…

Leetcode—1329. 将矩阵按对角线排序【中等】(unordered_map、priority_queue)

2024每日刷题&#xff08;121&#xff09; Leetcode—1329. 将矩阵按对角线排序 实现代码 class Solution { public:vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {const int m mat.size();const int n mat[0].size();unorder…