你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CUBEIDE的DAC输出,ADC输入并在SPI TFT上显示数据

[复制链接]
zhenwei7799 发布时间:2019-8-25 12:39
最近为了学习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)
  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
  2. {
  3.   /* EXTI line interrupt detected */
  4.   if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
  5.   {
  6.     __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
  7.     HAL_GPIO_EXTI_Callback(GPIO_Pin);
  8.   }
  9. }

  10. /**
  11.   * @brief  EXTI line detection callbacks.
  12.   * @param  GPIO_Pin Specifies the pins connected EXTI line
  13.   * @retval None
  14.   */
  15. __weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  16. {
  17.   /* Prevent unused argument(s) compilation warning */
  18.   UNUSED(GPIO_Pin);
  19.   /* NOTE: This function Should not be modified, when the callback is needed,
  20.            the HAL_GPIO_EXTI_Callback could be implemented in the user file
  21.    */
  22. }
复制代码
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)串口

  1. uint8_t RX_buff[RX_len];
  2. uint8_t RX_temp=0;
  3. uint8_t RX_i=0;
  4. uint8_t RX2_temp=0;

  5. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  6. {
  7. //        uint8_t buff[10];
  8.         if(huart->Instance==USART1)
  9.         {
  10.                 //HAL_UART_Transmit(&huart1, &RX_temp, 1, 1);
  11.                 if(RX_i>=RX_len)
  12.                 {
  13.                         RX_i=0;
  14.                         HAL_UART_Transmit(&huart1, send_buff, sizeof(send_buff), 1);
  15.                         memset(RX_buff,0,sizeof(RX_buff));
  16.                 }
  17.                 else
  18.                 {
  19.                         RX_buff[RX_i++]=RX_temp;
  20.                         if((RX_buff[RX_i-1]=='\n')||(RX_buff[RX_i-2]=='\r'))
  21.                         {
  22.                                 HAL_UART_Transmit(&huart1, RX_buff, strlen(RX_buff), 10);//Timeout 不能太小,也不能太长
  23.                                 memset(RX_buff,0,sizeof(RX_buff));
  24.                                 RX_i=0;
  25.                         }
  26.                 }
  27.                 HAL_UART_Receive_IT(&huart1, &RX_temp, 1);
  28.         }

  29.         if(huart->Instance==USART2)
  30.         {
  31.                 HAL_UART_Transmit(&huart2, &RX2_temp, 1, 10);
  32.                 HAL_UART_Receive_IT(&huart2, &RX2_temp, 1);
  33.         }
  34. }
复制代码
(2)TIM3定时器中断
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  2. {
  3.         if(htim->Instance=htim3.Instance)
  4.         {
  5.                 HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
  6.         }
  7. }
复制代码
(3)EXTI中断
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  2. {
  3.         HAL_Delay(100);

  4.         switch(GPIO_Pin)
  5.         {
  6.                 case WK_UP_Pin:
  7.                         if(HAL_GPIO_ReadPin(WK_UP_GPIO_Port,WK_UP_Pin) == 1)
  8.                         {
  9.                                 HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
  10.                                 DAC_Value=3299;
  11.                         }
  12.                 break;

  13.                 case GPIO_PIN_2:
  14.                         if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == 0)
  15.                         {
  16.                                 HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
  17.                                 if(DAC_Value<3200) DAC_Value+=100;

  18.                         }
  19.                 break;

  20.                 case GPIO_PIN_3:
  21.                         if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3) == 0)
  22.                         {
  23.                                 HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
  24.                                 if(DAC_Value>=100) DAC_Value-=100;
  25.                         }
  26.                 break;

  27.                 case GPIO_PIN_4:
  28.                         if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4) == 0)
  29.                         {
  30.                                 HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
  31.                                 DAC_Value=0;
  32.                         }
  33.                 break;
  34.         }
  35. }
复制代码
再看一下用SPI往LCD里面写数据的程序
  1. uint8_t SPI_WriteByte(uint8_t Byte)
  2. {
  3.           HAL_SPI_Transmit(&hspi2, &Byte, sizeof(Byte), 10);
  4. }
复制代码
下面看一下主函数
  1. int main(void)
  2. {
  3.   /* USER CODE BEGIN 1 */
  4.         uint8_t buff[50];

  5.   /* USER CODE END 1 */
  6.   

  7.   /* MCU Configuration--------------------------------------------------------*/

  8.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  9.   HAL_Init();

  10.   /* USER CODE BEGIN Init */

  11.   /* USER CODE END Init */

  12.   /* Configure the system clock */
  13.   SystemClock_Config();

  14.   /* USER CODE BEGIN SysInit */

  15.   /* USER CODE END SysInit */

  16.   /* Initialize all configured peripherals */
  17.   MX_GPIO_Init();
  18.   MX_DMA_Init();
  19.   MX_USART1_UART_Init();
  20.   MX_TIM3_Init();
  21.   MX_ADC1_Init();
  22.   MX_DAC_Init();
  23.   MX_SPI2_Init();
  24.   MX_USART2_UART_Init();
  25.   /* USER CODE BEGIN 2 */

  26.   LCD_Init();
  27.   POINT_COLOR=RED;
  28.   LCD_ShowString(10, 50, 16, "Welcome come to My world",0);

  29.   //LCD_BL_SET;
  30.   memset(RX_buff,0,RX_len);
  31.   HAL_UART_Receive_IT(&huart1, &RX_temp, 1);
  32.   HAL_UART_Receive_IT(&huart2, &RX2_temp, 1);

  33.   HAL_TIM_Base_Start_IT(&htim3);

  34.   HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
  35.   HAL_ADC_Start_DMA(&hadc1, ADC_val, ADC_length);

  36.   //HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0x100);
  37.   DAC1_Set_Vol(DAC_Value);
  38.   /* USER CODE END 2 */

  39.   /* Infinite loop */
  40.   /* USER CODE BEGIN WHILE */
  41.   while (1)
  42.   {
  43.     /* USER CODE END WHILE */

  44.     /* USER CODE BEGIN 3 */
  45.           HAL_Delay(500);
  46.           DAC1_Set_Vol(DAC_Value);
  47.           sprintf(buff,"S:ADC: %1.2f  DAC:%4d\r\n",Get_ADC(),DAC_Value);
  48.           LCD_ShowString(10, 70, 16, buff, 0);

  49.           sprintf(buff,"S:DACG:%5d\r\n",HAL_DAC_GetValue(&hdac,DAC_CHANNEL_1));
  50.           LCD_ShowString(10, 90, 16, buff, 0);
  51.           HAL_UART_Transmit(&huart1, buff, strlen(buff), 10);
  52.   }
  53.   /* USER CODE END 3 */
  54. }
复制代码
在STM32CUBEIDE中,想要调用sprintf()和printf()程序的话要在软件里设置一下

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

2019-08-25_124853.png
2019-08-25_125110.png
2019-08-25_125140.png
2019-08-25_125416.png
2019-08-25_125433.png
2019-08-25_201251.png
2019-08-25_201318.png
2019-08-25_201435.png
2019-08-25_201445.png
2019-08-25_201603.png
2019-08-25_201700.png
2019-08-25_201906.png
2019-08-25_201954.png
2019-08-25_202012.png
2019-08-25_202410.png
2019-08-25_204613.png

Pro5.zip

下载

2.68 MB, 下载次数: 43

收藏 评论1 发布时间:2019-8-25 12:39

举报

1个回答
mmuuss586 回答时间:2019-8-26 09:05:12

感谢分享

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版