1.总结串口的发送和接收功能使用到的函数
i>串口发送数据函数
(1)HAL_StatusTypeDef HAL_UART_Transmit();
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, \
const uint8_t *pData, uint16_t Size, uint32_t Timeout);
/*
UART_HandleTypeDef *huart:指定我们使用的哪个串口,需要指定串口1
const uint8_t *pData:要发送的数据
uint16_t Size:要发送的数据的长度,strlen,sizeof,sizeof会计算\0。
sizeof计算字符串所占内存的大小,strlen计算字符串的长度。
uint32_t Timeout:超时时间,单位是ms,
在规定时间没有将数据发送出去就会退出当前函数,执行下一句代码。
HAL_StatusTypeDef:是否成功发送数据
*/
ii>串口接收数据函数
(1)HAL_StatusTypeDef HAL_UATR_Receive_IT();
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)void HAL_UATR_RxCpltCallback();
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
//参数为指定我们使用的哪个串口
2.总结DMA的作用,和DMA+空闲中断的使用方式
i>作用:
DMA直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。
无需CPU干预,数据都可以通过DMA进行快速地传输,为其他操作保留了CPU资源。
简而言之,就是DMA类型的传输数据不需要占用CPU资源,可以提升CPU的资源利用率。
ii>使用方式
(1)通过编译初始化串口空闲中断。
(2)通过HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)函数
进行串口空闲中断处理。
(3)通过void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)回调函数来处理空闲中断。
3.使用PWM+ADC光敏电阻完成光控灯的实验
核心代码:
//main.c
int adc_val = 0;
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_TIM1_Init();
MX_TIM2_Init();
MX_USART1_UART_Init();
MX_ADC_Init();
MX_TIM3_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);//1.打开tim3通道
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET);
HAL_ADC_Start(&hadc);
adc_val = HAL_ADC_GetValue(&hadc);
printf("adc_val = %d\r\n",adc_val);
float volt = 1.0*adc_val/1240;
printf("volt = %.2f\r\n",volt);
//val越大,volt电压越大,电压越大灯越亮
float ccr3 = 100/3.3*volt;
printf("ccr3 = %f\r\n\r\n",ccr3);
HAL_Delay(1000);
TIM3->CCR3 = ccr3;
HAL_Delay(10);
}
/* USER CODE END 3 */
}