发新帖本帖赏金 3.00元(功能说明)我要提问
返回列表
打印
[STM32F4]

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

[复制链接]
1733|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
收到论坛赠送的板子之后就开始折腾了, 之前用过stm32f103,用的是标准外设库。 现在新出的MCU都只有HAL库。。。 于是我就开始慢慢学习HAL库和CubeMX软件的使用。
小车要用蓝牙串口模块接收指令,HAL库的串口可把我难住了。。 串口发送还算容易, 串口的中断接收把我看了一天, 在网上查了很多资料, 再结合st的例程, 才大致知道怎么用了。。

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


电机驱动用的L293D。
下面贴出部分代码
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();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM3_Init();
  MX_USART2_UART_Init();

  /* USER CODE BEGIN 2 */




        HAL_GPIO_WritePin (GPIOA,GPIO_PIN_5,GPIO_PIN_SET);



/* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
        HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
        HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_RESET);

  while (1)
  {
                  if(HAL_UART_Receive_IT(&huart2, &Dir, 1) != HAL_OK)
  {
    /* Transfer error in reception process */
    Error_Handler();
  }
        HAL_Delay(100);
                HAL_GPIO_TogglePin (GPIOA,GPIO_PIN_5);
        HAL_Delay(100);
                if(Dir != OldDir)
                                Period(Dir);
                OldDir = Dir;

}


}

/** System Clock Configuration
*/
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;

  __PWR_CLK_ENABLE();

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/* TIM3 init function */
void MX_TIM3_Init(void)
{

  TIM_MasterConfigTypeDef sMasterConfig;
  TIM_OC_InitTypeDef sConfigOC;

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 0;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 1000;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  HAL_TIM_PWM_Init(&htim3);

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

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 500;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);

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

}

/* USART2 init function */
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);

}

/** Configure pins as
        * Analog
        * Input
        * Output
        * EVENT_OUT
        * EXTI
*/
void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __GPIOA_CLK_ENABLE();
  __GPIOC_CLK_ENABLE();
  __GPIOB_CLK_ENABLE();

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

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

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

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

}

/* USER CODE BEGIN 4 */
static void Error_Handler(void)
{
                 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);       
}

void Period(int Dir)
{
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_RESET);
        switch(Dir)
                {
                        case 0x01:                                                                                                       
                                                PWM_Set(700,700);                        //向前
            break;
                        case 0x02:
                                                PWM_Set(700,300);                        //偏右
            break;
                        case 0x03:
                                                PWM_Set(700,-300);                //向右直角转弯
            break;
                        case 0x04:
                                                PWM_Set(-700,-300);
                                                break;
                        case 0x05:
                                                PWM_Set(-700,-700);                //ºóÍË
                                                break;
                        case 0x06:
                                                PWM_Set(-300,-700);
                                                break;
                  case 0x07:
                                                PWM_Set(-300,700);
                                                break;
                        case 0x08:
                                                PWM_Set(300,700);                        //×óÆ«
                                                break;

                        default :
                                        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
                                        HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_RESET);
                }
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_SET);
}

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

        if(Left>=0)
                {
                __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,Left);
                HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
                }
        else if(Left<0)
                {
                __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,-Left);
                HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
                }
        if(Right>=0)
                {
                __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,Right);
                HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
                }
        else if(Right<0)
                {
                __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,-Right);
                HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
                }

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

引脚.jpg (142.84 KB )

引脚.jpg

驱动.jpg (113.33 KB )

驱动.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啊

使用特权

评论回复
5
逍遥李| | 2015-10-10 15:16 | 只看该作者
车呢小车呢楼主~~~

使用特权

评论回复
6
冰河w| | 2015-10-10 21:59 | 只看该作者
楼主这块是蓝牙部分吧

使用特权

评论回复
7
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);

}
这串口初始化的真给力。

使用特权

评论回复
发新帖 本帖赏金 3.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

16

帖子

0

粉丝