1.思维导图

个人暂时的学后感,不一定对,没什么东西,为做项目奔波中。。。
1.使用ADC采样光敏电阻数值,如何根据这个数值调节LED灯亮度。
  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
		adc_val = HAL_ADC_GetValue(&hadc);
		if(adc_val<3300&&flag==0)
		{	
			flag=1;
			for(i=500;i>0;i--)
			{
				TIM3->CCR3 = i;
				HAL_Delay(1);
			}
		}
		if(adc_val>3800&&flag==1)
		{	
			flag=0;
			for(i=0;i<=500;i++)
			{
			TIM3->CCR3 = i;
			HAL_Delay(1);
			}
		}
		HAL_Delay(1000);
  }
  /* USER CODE END 3 */2.总结DMA+空闲中断接收数据的使用方法
 原理是原本有cpu处理的数据交由DMA处理,
 DMA接收时,一包数据接收完毕,会有一段空闲时间,例如传输一个字节所需的时间,就能把这包数据处理完,例如,通过串口发回电脑端。
 DMA跟定时器有些相似,定时器是超时时间超时时,执行任务;
 DMA是事件到了,比如一包数据输出完后,存在一个字节没有接收数据的时间,在这段时间内执行事件。
 都有回调函数,执行原因不同,
 DMA与CPU发送数据的区别,DMA的事件触发是接收完毕数据包后执行,CPU的事件触发是接收到单个字符时执行。
 处理的数据长度不同。
1.DMA的作用(DMA+空闲中断接收数据)
 DMA代替cpu检测并接收数据,接收完数据后会产生空闲中断,利用空闲中断对接收到的数据进行处理。
2.串口重定向(如何实现串口重定向)
 在usart.c文件中在最底行重新定义串口fputc函数
 例如:
 int fputc(int ch,FILE* f)
 {
     HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,1000);
     return 0;
 }
3.串口的数据接收
 串口数据接收有两种方法,完成中断回调函数,完成空闲中断回调函数。
 前者用于处理已知长度的数据包
 后者用于处理数据量大或长度不确定的情况
4.ADC采样(分辨率,采样时间)
 ADC全称是模拟数字转换器,分辨率是采样的精度,采样时间就是字面意思,采一次样本需要的时长,在STM32里面最长采样时间是239.5Cycles,根据需求选择采样时间。
5.PWM(占空比,ARR,CNT和CCRX的关系)(如何去调整占空比)
 PWM是调波,占空比是高电平占整个周期的时间/总-电平时间
 PWM是脉宽调制的缩写,是一种通过控制信号的脉冲宽度来产生模拟效果的技术,PWM信号是一系列周期性的脉冲组成,每个脉冲的宽度可以调整,从而改变其平均功率或能量。
 ARR是重装载值,CNT是计数值(预分频系数),CCRX是设置的阈值,也就是比较寄存器,高于CCRX端为高电平,低于为低电平,因为lED灯是低电平点亮,所以这里CCRX数值越大LED越亮,低电平在这个周期内占比多,达到调节电压的效果,就行稀释一样,需要低浓度还是高浓度,看比例调整,在微观角度调整,在宏观角度实现相同的效果。
  


















