STM32基础入门
任务描述
编程实现以下功能:
1.创建CUBMAX工程,并用Keil修改程序,编译后下载到M3,当程序启动时,LED9开始闪烁。(1)
2.使用定时器实现,每过1秒LED1、LED3、LED5、LED7、依次亮起,后灯亮起时,前灯灭。(1)
3.在M3上选择适当引脚连接继电器,继电器控制灯泡。当KEY1键按下,灯泡亮,KEY2按下灯泡灭(1)
4扩展试题
M3模块连接光照传感器,采集到的光照数据通过USART5发送到云平台,使云台出现光照数据。(2)
光明传感器发往物联网网关的帧协议格式如下:
说明 |
START |
ADDR |
CMD |
LEN |
TYPE |
DATA |
CheckSum |
长度 |
1Byte |
2Byte |
1Byte |
1Byte |
1Byte |
2Byte |
1Byte |
值 |
0xDD |
0x0001 |
0x02 |
0x0x09 |
0x06 |
|
|
注:2字节时先发高位。
一、设备
- M3模块1个
- 双联继电器一块
- 灯泡一个
- 物联网王网关一个
- 导线若干
二、任务描述
2.1 创建CUBMAX工程,并用Keil修改程序,编译后下载到M3,当程序启动时,LED9开始闪烁。
生成工程,添加代码
/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { HAL_GPIO_TogglePin(LED9_GPIO_Port,LED9_Pin); HAL_Delay(500);
2.2、使用定时器实现,每过1秒LED1、LED3、LED5、LED7、依次亮起,后灯亮起时,前灯灭。
生成代码
/* USER CODE BEGIN 2 */ //启动定时器 if(HAL_TIM_Base_Start_IT(&htim6)!=HAL_OK) { Error_Handler(); } /* USER CODE END 2 */
/* USER CODE BEGIN 4 */ //定时器回调函数 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { //是否 if(TIM6 == htim->Instance) { num = num>>2; if(num == 0) num = 0x80; HAL_GPIO_WritePin(GPIOE,0xff,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE,num,GPIO_PIN_RESET); } }
2.3、在M3上选择适当引脚连接继电器,继电器控制灯泡。当KEY1键按下,灯泡亮,KEY2按下灯泡灭
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin & GPIO_PIN_13) { //keydown_flag = 1; //count +=1; HAL_Delay(300); HAL_GPIO_WritePin(GPIOE,Relay_Pin,GPIO_PIN_SET); //keydown_flag = 0; } }
//判断引脚PD13是否为高电平 if((~GPIOD->IDR)& GPIO_IDR_IDR13) { //是高电平让引脚PE为低电平,从而使灯泡熄灭 HAL_GPIO_WritePin(GPIOE,Relay_Pin,GPIO_PIN_RESET); }
2.4、扩展试题
3模块连接光照传感器,采集到的光照数据通过USART5发送到云平台,使云台出现光照数据。(2)
光明传感器发往物联网网关的帧协议格式如下:
说明 |
START |
ADDR |
CMD |
LEN |
TYPE |
DATA |
CheckSum |
长度 |
1Byte |
2Byte |
1Byte |
1Byte |
1Byte |
2Byte |
1Byte |
值 |
0xDD |
0x0001 |
0x02 |
0x0x09 |
0x06 |
|
|
注:2字节时先发高位。
//HAL_Delay(1000); //light pushbuf[0]=0xDD; //开头 pushbuf[1]=0x06; //地址位 pushbuf[2]=0x00; pushbuf[3]=0x02; //命令码 0x02RS485,0x01CAN pushbuf[4]=0x09; //长度 pushbuf[5]=0x06; //传感器类型 pushbuf[6]=Get_Voltage()*10>>8; //数据位,高八位 pushbuf[7]=Get_Voltage()*10&0xFF; //第八位 pushbuf[8]=CHK(pushbuf,8); //校验位 HAL_UART_Transmit(&huart5,pushbuf,9,0xffff); }
static uint8_t CHK(const uint8_t *buf, uint8_t len) { uint8_t RX_CHX=0; while(len--) { RX_CHX+= *buf; buf++; } return RX_CHX&=0xff; } uint16_t Get_Voltage(void) { uint16_t voltage; uint16_t adcx=0; HAL_ADC_Start(&hadc1); //启动ADC HAL_ADC_PollForConversion(&hadc1,10); //等待采集完成 adcx = HAL_ADC_GetValue(&hadc1); //获取ADC采集数据 voltage=(adcx*330)/4096; //将采集到的数据转换为电压值 HAL_ADC_Stop(&hadc1); //停止ADC return voltage; }