小言_互联网的博客

STM32 HAL PWM DMA 传输数据

212人阅读  评论(0)

1、设置pwm dma配置


  
  1. /* Private function prototypes -----------------------------------------------*/
  2. void SystemClock_Config(void);
  3. /* USER CODE BEGIN PFP */
  4. /* USER CODE END PFP */
  5. /* Private user code ---------------------------------------------------------*/
  6. /* USER CODE BEGIN 0 */
  7. uint16_t buffer[ 10];
  8. /* USER CODE END 0 */
  9. /**
  10. * @brief The application entry point.
  11. * @retval int
  12. */
  13. int main(void)
  14. {
  15. /* USER CODE BEGIN 1 */
  16. /* USER CODE END 1 */
  17. /* MCU Configuration--------------------------------------------------------*/
  18. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  19. HAL_Init();
  20. /* USER CODE BEGIN Init */
  21. /* USER CODE END Init */
  22. /* Configure the system clock */
  23. SystemClock_Config();
  24. /* USER CODE BEGIN SysInit */
  25. /* USER CODE END SysInit */
  26. /* Initialize all configured peripherals */
  27. MX_GPIO_Init();
  28. MX_DMA_Init();
  29. MX_TIM2_Init();
  30. /* USER CODE BEGIN 2 */
  31. for( int i = 0;i< 10;i++)
  32. {
  33. buffer[i] = 20 + i* 5;
  34. }
  35. /* USER CODE END 2 */
  36. /* Infinite loop */
  37. /* USER CODE BEGIN WHILE */
  38. while ( 1)
  39. {
  40. HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_1, ( uint32_t *)&buffer, 10);
  41. /* USER CODE END WHILE */
  42. /* USER CODE BEGIN 3 */
  43. }
  44. /* USER CODE END 3 */
  45. }

示波器波形如图:

不过我数组定义的是  uint16_t buffer[10];

数组初始化累加


  
  1. for(int i = 0 ;i<10;i++)
  2. {
  3. buffer[ i] = 20 + i*5;
  4. }

数据发送是

        HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_1, (uint32_t *)&buffer,10);

按照道理 是10个方波 周期是 800k  【mcu 主频64M】

10个占空比依次增大。但是上图的现象不是这样的。

本着求知的心态,希望找出问题

首先 我们设置了uint16 的数组,也设置了dma 半字的传输方式,按理来说应该是正常的输出波形

难道是HAL_TIM_PWM_Start_DMA 这个 (uint32_t *) 字符指针?我修改成 void *  波形也没有变化,我查了网上的资料,这个可以不用管。

主要是dma传输 设置 和数组定义。

后面在网上找到问题的解决方法。


  
  1. for(int i = 0 ;i<10;i++)
  2. {
  3. buffer[ i] = 20 + i*5;
  4. }
  5. buffer[9] = 0 ;

定义的传输数组的最后一个数组,设置为零,这样传输数据就可以正常现象了。

【比如需要10个字符,可以定义11个,最后一个设置为0就好了】

 


转载:https://blog.csdn.net/penglijiang/article/details/116706946
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场