最近为了学习HAL库和熟悉STM32CUBEIDE软件,用手上STM32F407板子做了小工程,里面包含有串口1,串口2的使用,定时器中断,EXTI,DAC输出,ADC的DMA读取和用SPI驱动的TFT彩屏显示。
先放一张工程做好的图吧

程序很简单,用CUBEMX初始化后,只需要自己写回调函数和主函数的部分,先看一下外设的CUBEMX初始化;
(1)USART1和USART2


两个串口的初始化是一样的这是设置的NVIC中断不同,后面放出工程的NVIC配置。
(2)TIM3


定时器的配置要多一点,但只用定时器则比较简单
(3)ADC6




ADC的DMA读取设置

(4)DAC1

(5)SPI2

(6)EXTI

(7)NVIC

(8)GPIO

所有的外设初始化配置完成了;
下面看一下中断相应的回调函数,在HAL库中,写中断处理函数和标准库不同,我个人认为现在只需要在回调函数里写内容就行了,我们看一下HAL库里面的IRQ函数,比如HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)- void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
- {
- /* EXTI line interrupt detected */
- if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
- {
- __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
- HAL_GPIO_EXTI_Callback(GPIO_Pin);
- }
- }
- /**
- * @brief EXTI line detection callbacks.
- * @param GPIO_Pin Specifies the pins connected EXTI line
- * @retval None
- */
- __weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
- {
- /* Prevent unused argument(s) compilation warning */
- UNUSED(GPIO_Pin);
- /* NOTE: This function Should not be modified, when the callback is needed,
- the HAL_GPIO_EXTI_Callback could be implemented in the user file
- */
- }
复制代码 HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)里面会调用 HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)函数,而 HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)是需要自己编写。
(1)串口
- uint8_t RX_buff[RX_len];
- uint8_t RX_temp=0;
- uint8_t RX_i=0;
- uint8_t RX2_temp=0;
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
- {
- // uint8_t buff[10];
- if(huart->Instance==USART1)
- {
- //HAL_UART_Transmit(&huart1, &RX_temp, 1, 1);
- if(RX_i>=RX_len)
- {
- RX_i=0;
- HAL_UART_Transmit(&huart1, send_buff, sizeof(send_buff), 1);
- memset(RX_buff,0,sizeof(RX_buff));
- }
- else
- {
- RX_buff[RX_i++]=RX_temp;
- if((RX_buff[RX_i-1]=='\n')||(RX_buff[RX_i-2]=='\r'))
- {
- HAL_UART_Transmit(&huart1, RX_buff, strlen(RX_buff), 10);//Timeout 不能太小,也不能太长
- memset(RX_buff,0,sizeof(RX_buff));
- RX_i=0;
- }
- }
- HAL_UART_Receive_IT(&huart1, &RX_temp, 1);
- }
- if(huart->Instance==USART2)
- {
- HAL_UART_Transmit(&huart2, &RX2_temp, 1, 10);
- HAL_UART_Receive_IT(&huart2, &RX2_temp, 1);
- }
- }
复制代码 (2)TIM3定时器中断
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
- {
- if(htim->Instance=htim3.Instance)
- {
- HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
- }
- }
复制代码 (3)EXTI中断
- void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
- {
- HAL_Delay(100);
- switch(GPIO_Pin)
- {
- case WK_UP_Pin:
- if(HAL_GPIO_ReadPin(WK_UP_GPIO_Port,WK_UP_Pin) == 1)
- {
- HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
- DAC_Value=3299;
- }
- break;
- case GPIO_PIN_2:
- if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == 0)
- {
- HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
- if(DAC_Value<3200) DAC_Value+=100;
- }
- break;
- case GPIO_PIN_3:
- if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3) == 0)
- {
- HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
- if(DAC_Value>=100) DAC_Value-=100;
- }
- break;
- case GPIO_PIN_4:
- if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4) == 0)
- {
- HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
- DAC_Value=0;
- }
- break;
- }
- }
复制代码 再看一下用SPI往LCD里面写数据的程序
- uint8_t SPI_WriteByte(uint8_t Byte)
- {
- HAL_SPI_Transmit(&hspi2, &Byte, sizeof(Byte), 10);
- }
复制代码 下面看一下主函数
- int main(void)
- {
- /* USER CODE BEGIN 1 */
- uint8_t buff[50];
- /* 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_USART1_UART_Init();
- MX_TIM3_Init();
- MX_ADC1_Init();
- MX_DAC_Init();
- MX_SPI2_Init();
- MX_USART2_UART_Init();
- /* USER CODE BEGIN 2 */
- LCD_Init();
- POINT_COLOR=RED;
- LCD_ShowString(10, 50, 16, "Welcome come to My world",0);
- //LCD_BL_SET;
- memset(RX_buff,0,RX_len);
- HAL_UART_Receive_IT(&huart1, &RX_temp, 1);
- HAL_UART_Receive_IT(&huart2, &RX2_temp, 1);
- HAL_TIM_Base_Start_IT(&htim3);
- HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
- HAL_ADC_Start_DMA(&hadc1, ADC_val, ADC_length);
- //HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0x100);
- DAC1_Set_Vol(DAC_Value);
- /* USER CODE END 2 */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- HAL_Delay(500);
- DAC1_Set_Vol(DAC_Value);
- sprintf(buff,"S:ADC: %1.2f DAC:%4d\r\n",Get_ADC(),DAC_Value);
- LCD_ShowString(10, 70, 16, buff, 0);
- sprintf(buff,"S:DACG:%5d\r\n",HAL_DAC_GetValue(&hdac,DAC_CHANNEL_1));
- LCD_ShowString(10, 90, 16, buff, 0);
- HAL_UART_Transmit(&huart1, buff, strlen(buff), 10);
- }
- /* USER CODE END 3 */
- }
复制代码 在STM32CUBEIDE中,想要调用sprintf()和printf()程序的话要在软件里设置一下

(PS:软件里面也要选Debug模式,Release模式好像编译不了这两个函数)
工程:Pro5.zip
|
感谢分享