[STM32F4] 【f446re开发板试用】+ 蓝牙小车

[复制链接]
1980|6
 楼主| learner是 发表于 2015-10-4 00:00 | 显示全部楼层 |阅读模式
收到论坛赠送的板子之后就开始折腾了, 之前用过stm32f103,用的是标准外设库。 现在新出的MCU都只有HAL库。。。 于是我就开始慢慢学习HAL库和CubeMX软件的使用。
小车要用蓝牙串口模块接收指令,HAL库的串口可把我难住了。。 串口发送还算容易, 串口的中断接收把我看了一天, 在网上查了很多资料, 再结合st的例程, 才大致知道怎么用了。。

这是引脚分配, 用了定时器3的2个通道(在配置定时器的时候发现,之前用M3的时候选Output Compare就能输出PWM波, 现在要选PWM Generation).


电机驱动用的L293D。
下面贴出部分代码
  1. int main(void)
  2. {

  3.   /* USER CODE BEGIN 1 */

  4.   /* USER CODE END 1 */

  5.   /* MCU Configuration----------------------------------------------------------*/

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

  8.   /* Configure the system clock */
  9.   SystemClock_Config();

  10.   /* Initialize all configured peripherals */
  11.   MX_GPIO_Init();
  12.   MX_TIM3_Init();
  13.   MX_USART2_UART_Init();

  14.   /* USER CODE BEGIN 2 */




  15.         HAL_GPIO_WritePin (GPIOA,GPIO_PIN_5,GPIO_PIN_SET);



  16. /* USER CODE END 2 */

  17.   /* Infinite loop */
  18.   /* USER CODE BEGIN WHILE */
  19.         HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
  20.         HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
  21.         HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
  22.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_RESET);

  23.   while (1)
  24.   {
  25.                   if(HAL_UART_Receive_IT(&huart2, &Dir, 1) != HAL_OK)
  26.   {
  27.     /* Transfer error in reception process */
  28.     Error_Handler();
  29.   }
  30.         HAL_Delay(100);
  31.                 HAL_GPIO_TogglePin (GPIOA,GPIO_PIN_5);
  32.         HAL_Delay(100);
  33.                 if(Dir != OldDir)
  34.                                 Period(Dir);
  35.                 OldDir = Dir;

  36. }


  37. }

  38. /** System Clock Configuration
  39. */
  40. void SystemClock_Config(void)
  41. {

  42.   RCC_OscInitTypeDef RCC_OscInitStruct;

  43.   __PWR_CLK_ENABLE();

  44.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);

  45.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  46.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  47.   RCC_OscInitStruct.HSICalibrationValue = 16;
  48.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  49.   HAL_RCC_OscConfig(&RCC_OscInitStruct);

  50.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

  51.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  52.   /* SysTick_IRQn interrupt configuration */
  53.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  54. }

  55. /* TIM3 init function */
  56. void MX_TIM3_Init(void)
  57. {

  58.   TIM_MasterConfigTypeDef sMasterConfig;
  59.   TIM_OC_InitTypeDef sConfigOC;

  60.   htim3.Instance = TIM3;
  61.   htim3.Init.Prescaler = 0;
  62.   htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  63.   htim3.Init.Period = 1000;
  64.   htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  65.   HAL_TIM_PWM_Init(&htim3);

  66.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  67.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  68.   HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig);

  69.   sConfigOC.OCMode = TIM_OCMODE_PWM1;
  70.   sConfigOC.Pulse = 500;
  71.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  72.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  73.   HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);

  74.   sConfigOC.Pulse = 300;
  75.   HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2);

  76. }

  77. /* USART2 init function */
  78. void MX_USART2_UART_Init(void)
  79. {

  80.   huart2.Instance = USART2;
  81.   huart2.Init.BaudRate = 9600;
  82.   huart2.Init.WordLength = UART_WORDLENGTH_8B;
  83.   huart2.Init.StopBits = UART_STOPBITS_1;
  84.   huart2.Init.Parity = UART_PARITY_NONE;
  85.   huart2.Init.Mode = UART_MODE_TX_RX;
  86.   huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  87.   huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  88.   HAL_UART_Init(&huart2);

  89. }

  90. /** Configure pins as
  91.         * Analog
  92.         * Input
  93.         * Output
  94.         * EVENT_OUT
  95.         * EXTI
  96. */
  97. void MX_GPIO_Init(void)
  98. {

  99.   GPIO_InitTypeDef GPIO_InitStruct;

  100.   /* GPIO Ports Clock Enable */
  101.   __GPIOA_CLK_ENABLE();
  102.   __GPIOC_CLK_ENABLE();
  103.   __GPIOB_CLK_ENABLE();

  104.   /*Configure GPIO pin : PA5 */
  105.   GPIO_InitStruct.Pin = GPIO_PIN_5;
  106.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  107.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  108.   GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  109.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  110.   /*Configure GPIO pin : PC7 */
  111.   GPIO_InitStruct.Pin = GPIO_PIN_7;
  112.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  113.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  114.   GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  115.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  116.   /*Configure GPIO pins : PB6 PB9 */
  117.   GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_9;
  118.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  119.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  120.   GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  121.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  122.   /*Configure GPIO pin : PB8 */
  123.   GPIO_InitStruct.Pin = GPIO_PIN_8;
  124.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  125.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  126.   GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
  127.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  128. }

  129. /* USER CODE BEGIN 4 */
  130. static void Error_Handler(void)
  131. {
  132.                  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);       
  133. }

  134. void Period(int Dir)
  135. {
  136.         HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
  137.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_RESET);
  138.         switch(Dir)
  139.                 {
  140.                         case 0x01:                                                                                                       
  141.                                                 PWM_Set(700,700);                        //向前
  142.             break;
  143.                         case 0x02:
  144.                                                 PWM_Set(700,300);                        //偏右
  145.             break;
  146.                         case 0x03:
  147.                                                 PWM_Set(700,-300);                //向右直角转弯
  148.             break;
  149.                         case 0x04:
  150.                                                 PWM_Set(-700,-300);
  151.                                                 break;
  152.                         case 0x05:
  153.                                                 PWM_Set(-700,-700);                //ºóÍË
  154.                                                 break;
  155.                         case 0x06:
  156.                                                 PWM_Set(-300,-700);
  157.                                                 break;
  158.                   case 0x07:
  159.                                                 PWM_Set(-300,700);
  160.                                                 break;
  161.                         case 0x08:
  162.                                                 PWM_Set(300,700);                        //×óÆ«
  163.                                                 break;

  164.                         default :
  165.                                         HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
  166.                                         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_RESET);
  167.                 }
  168.         HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
  169.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_SET);
  170. }

  171. void PWM_Set(int Left, int Right)  //设置PWM波
  172. {

  173.         if(Left>=0)
  174.                 {
  175.                 __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,Left);
  176.                 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
  177.                 }
  178.         else if(Left<0)
  179.                 {
  180.                 __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,-Left);
  181.                 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
  182.                 }
  183.         if(Right>=0)
  184.                 {
  185.                 __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,Right);
  186.                 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
  187.                 }
  188.         else if(Right<0)
  189.                 {
  190.                 __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,-Right);
  191.                 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
  192.                 }

  193. }
由于我要用手机上的一个app控制小车运动,又没有其他可以拍照的设备, 所以就没法分享视频了。。。  
引脚.jpg
驱动.jpg

打赏榜单

21ic小喇叭 打赏了 3.00 元 2015-10-26

mintspring 发表于 2015-10-4 08:13 | 显示全部楼层
小车在哪里?哈哈,楼主虚构的小车吗
sky.sun.zz 发表于 2015-10-4 11:35 | 显示全部楼层
楼主:没见到你是如何连接蓝牙的?
 楼主| learner是 发表于 2015-10-5 16:32 | 显示全部楼层
sky.sun.zz 发表于 2015-10-4 11:35
楼主:没见到你是如何连接蓝牙的?

HC05啊
逍遥李 发表于 2015-10-10 15:16 | 显示全部楼层
车呢小车呢楼主~~~
冰河w 发表于 2015-10-10 21:59 | 显示全部楼层
楼主这块是蓝牙部分吧
734774645 发表于 2015-10-10 23:15 | 显示全部楼层
void MX_USART2_UART_Init(void)
{

  huart2.Instance = USART2;
  huart2.Init.BaudRate = 9600;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  HAL_UART_Init(&huart2);

}
这串口初始化的真给力。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

16

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部