STM32U575RIT6单片机(五)
作业1:实验多通道采集芯片VBAT电压和内部温度(ADC4)。
/* USER CODE BEGIN WHILE */ HAL_PWREx_EnableVddA(); //1、开启电压域 HAL_ADCEx_Calibration_Start(&hadc4,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED); //2、开启ADC校准 float ADC_buff[2]; while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_ADC_Start(&hadc4); //3、开启ADC采样 for(int i=0;i<2;i++) { HAL_ADC_PollForConversion(&hadc4,100); //4、等待100msADC转化完成 ADC_buff[i] = HAL_ADC_GetValue(&hadc4); //5、获取DR寄存器的值 } HAL_ADC_Stop(&hadc4); //6、停止采样 //电压 ADC_buff[1] = (ADC_buff[1]*3.3)/4095; //转换为标准电压 //温度 ADC_buff[0] = (((ADC_buff[0]*3.3)/4095)*1000-685)/2.5; printf("Vbat: %.2f V\nTbat: %.2f degC\n",ADC_buff[1]*4,ADC_buff[0]); //输出采样结果 HAL_Delay(1000); } /* USER CODE END 3 */ }
作业2:PWM实现, 通过旋转旋钮, 控制蜂鸣器/马达/风扇的运行频率。
读取旋钮的值,将值分为多个等份,判断每个等份后设置比较寄存器的值。/* USER CODE BEGIN WHILE */ HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2); while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_PWREx_EnableVddA();//开启电压必须要有 HAL_ADCEx_Calibration_Start(&hadc1,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED); HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1,100);//等待ADC转换100毫秒 uint32_t val = HAL_ADC_GetValue(&hadc1);//获取ADC转换后的值 val = ((val*1.0000)-20)/7.406; double pwm = 0.00; pwm = (val*1.0000)/2000*100; printf("PWM = %.2f%%\n",pwm); __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,val); __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,val); __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,val); HAL_Delay(500); HAL_ADC_Stop(&hadc1);//关闭ADC } /* USER CODE END 3 */ }
作业3:显示一个动图
/* Initialize all configured peripherals */ MX_GPIO_Init(); MX_SPI1_Init(); MX_ICACHE_Init(); /* USER CODE BEGIN 2 */ ILI9341_Init(); //olcd初始化 /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ ILI9341_Clear(YELLOW); //清屏 LCD_picture2(); HAL_Delay(1000); //Gui_DrawFont_GBK16(200,0,RED,YELLOW, (uint8_t*)"China"); //LCD_gif(); while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ LCD_gif(); }
void LCD_picture1() { uint8_t temp[2] = {}; //给 ILI9341寄存器 写入 写数据命令 ILI9341_WR_REG(0x2C); //屏幕中, 一个像素点占用两个字节 uint32_t len = 2*240*320; uint32_t i = 0; while(i < len) { temp[0] = gImage_1[i]; temp[1] = gImage_1[i+1]; HAL_SPI_Transmit(&hspi1,temp,2,0); i = i+2; } } //1~23 void LCD_gif() { LCD_picture1(); LCD_picture3(); LCD_picture5(); LCD_picture7(); LCD_picture9(); LCD_picture11(); LCD_picture13(); LCD_picture15(); LCD_picture17(); LCD_picture19(); LCD_picture21(); LCD_picture23(); }