1.总结串口的发送和接收功能使用到的函数
串口发送函数
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
UART_HandleTypeDef *huart:指定发送串口
const uint8_t *pData:要发送的数据
uint16_t Size:要发送的数据字节数(数据的长度),strlen可以计算字符串的长度,使用sizeof计算的是字符串所占内存的大小
uint32_t Timeout:超时时间,单位是ms
串口接收函数
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
UART_HandleTypeDef *huart:指定接收串口
uint8_t *pData:接收到数据后保存的地址
uint16_t Size:每一次接收多少个字节数据
HAL_StatusTypeDef:是否成功开启串口接收功能
2.总结DMA的作用,和DMA+空闲中断的使用方式
DMA是提供在外设和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速的移动,节省了CPU的资源,用来做其他操作。
DMA+空闲中断用来接收长度不确定的数据
空闲中断:在发送一串字符串时,两个字符之间的间隔非常短,所以在两个字符之间不叫空闲,当总线上在一个字节的时间内没有再接收到数据时,就会启动空闲中断。
当发送完一次数据后,过一个发送字节的时间内没有收到数据,启动空闲中断,处理接收到的一包数据。
DMA接收函数
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
UART_HandleTypeDef *huart:接收串口
uint8_t *pData:接收的数据的保存地址
uint16_t Size:每次最多接收数据的大小
HAL_StatusTypeDef:是否成功开启DMA+空闲中断的接收方式
处理完一次数据需要对数据清空:memset(数组名,0,数组大小);
DMA发送函数
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
UART_HandleTypeDef *huart:给哪个串口发送消息
const uint8_t *pData:发送的数据
uint16_t Size:每次发送数据的大小
HAL_StatusTypeDef:是否发送成功
3.使用PWM+ADC光敏电阻完成光控灯的实验
ADC采样:ADC可以将模拟信号转换为数字信号。
开启ADC采样函数
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc)
ADC_HandleTypeDef* hadc:要打开的ADC
HAL_StatusTypeDef:是否成功打开ADC采样
获取ADC采样函数:
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)
uint32_t:获取到的ADC采样值
ADC_HandleTypeDef* hadc:从哪个ADC中获取采样值
PWM是脉宽调制,通过控制信号的脉冲宽度来产生模拟效果。由定时器产生。
占空比:高电平时间 / 整个周期时间 * 100%
调节占空比的本质就是调节电压值的大小
开启PWM通道函数
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
TIM_HandleTypeDef *htim:开启的定时器的通道
uint32_t Channel:选择的通道,TIM_CHANNEL_3
HAL_StatusTypeDef:是否成功开启PWM通道
while(1){HAL_ADC_Start(&hadc);adc_val=HAL_ADC_GetValue(&hadc);printf("%d\r\n",adc_val);//HAL_Delay(1000);int j=adc_val*999.0/4000.0;TIM3->CCR3=j;HAL_Delay(2);}