×
单片机 > 单片机程序设计 > 详情

基于stm32CubeMX和keil5的stm32f103学习编程

发布时间:2020-08-31 发布时间:
|

0. 准备

先用st-link连接stm32核心板与PC,用于烧录

St-link

Stm32

3.3V

3.3V

GND

GND

SWDIO

DIO

SWCLK

DCLK

再用USB串口板连接,用于查看串口输出

USB

Stm32

RX

TX(A9)

TX

RX(A10)

安装完成驱动并连接好以后,进入设备管理器可以看到它们都已被识别。

打开putty.exe,选择串口连接,用于查看之后的串口输出。

  • void UART0_Init(UART_HandleTypeDef* UartHandle){  

  •     UartHandle->Instance = USART1;  

  •     UartHandle->Init.BaudRate = 9600;  

  •     UartHandle->Init.WordLength = UART_WORDLENGTH_8B;  

  •     UartHandle->Init.StopBits = UART_STOPBITS_1;  

  •     UartHandle->Init.Parity = UART_PARITY_NONE;  

  •     UartHandle->Init.HwFlowCtl = UART_HWCONTROL_NONE;  

  •     UartHandle->Init.Mode = UART_MODE_TX_RX;  

  •    

  •     HAL_UART_Init(UartHandle);  

  • }  


  • 在main函数中填上下面两行代码­


    1.   UART_HandleTypeDef UartHandle;  
    2.   UART0_Init(&UartHandle);  



    以及输出hello的代码


    1. HAL_UART_Transmit(&UartHandle, (uint8_t*)”hello\r\n”, 7, 500);  


    完成代码后,­准备编译。选择flash-设置,进入Utilities标签,选择settings,配置如下:

  • void MX_GPIO_Init(void)  

  • {  

  • ……  

  •   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;  

  •   GPIO_InitStruct.Pull = GPIO_PULLUP;  

  • ……  

  • }  

  • 在while(1)中添加代码,循环检测并输出


    1. ……  

    2.   if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11))  

    3.    HAL_UART_Transmit(&UartHandle, (uint8_t*)”Pressed\r\n”, 9, 500);  

    4.   else  

    5.    HAL_UART_Transmit(&UartHandle, (uint8_t*)”Not pressed\r\n”, 13, 500);  

    6. ……  


    输出如图

  • GPIO_InitStruct.Pin = GPIO_PIN_12;  

  • GPIO_InitStruct.Mode = GPIO_MODE_INPUT;  

  • GPIO_InitStruct.Pull = GPIO_PULLUP;  

  • GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;  

  • HAL_NVIC_SetPriority(EXTI15_10_IRQn,0,0);  

  • HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);  

  • HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);  


  • PA12引脚的下降沿触发将会触发中断,进入函数EXTI15_10_IRQHandler,此时在函数中调用HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12)表示查看PA12的值,如果符合条件,则触发HAL_GPIO_EXTI_Callback函数。代码如下


    1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){  

    2.     if (GPIO_Pin == GPIO_PIN_12){  

    3.         PA12flag = 1;  

    4.         PA12cnt++;  

    5.     }else{  

    6.         UNUSED(GPIO_Pin);  

    7.     }  

    8. }  


    在main函数的while循环中添加代码:


    1. if(PA12flag == 1){  

    2.   PA12flag = 0;  

    3.   size = sprint(str, ”Count: %d\r\n”,PA12cnt);  

    4.   HAL_UART_Transmit(&UartHandle, (uint8_t*)str, size, 500);  

    5. }  

  • void TIM_Init(){  

  •     TIM_Handle.Instance = TIM3;  

  •        TIM_Handle.Init.Prescaler = 8000;  

  •        TIM_Handle.Init.CounterMode = TIM_COUNTERMODE_UP;  

  •        TIM_Handle.Init.Period = 199;  

  •        TIM_Handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;  

  •         

  •        HAL_TIM_Base_Init(&TIM_Handle);  

  •          

  •        sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; //设置时钟源为内部时钟  

  •        HAL_TIM_ConfigClockSource(&TIM_Handle, &sClockSourceConfig);  

  •        sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;//设置复位模式,发生触发输入事件时计数器和预分频器能重新初始化  

  •        sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;  

  •        HAL_TIMEx_MasterConfigSynchronization(&TIM_Handle, &sMasterConfig);  

  •         

  •        HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);//设置优先级  

  •        HAL_NVIC_EnableIRQ(TIM3_IRQn);enable中断向量表处理    

  • }  


  • 和之前设置的中断一样需要覆写中断触发函数TIM3_IRQHandler,而后在其中对时钟进行判断后触发HAL_TIM_PeriodElapsedCallback。并在callback中实现操作。


    1. TIM_HandleTypeDef TIM_Handle;  

    2. TIM_ClockConfigTypeDef sClockSourceConfig;  

    3. TIM_MasterConfigTypeDef sMasterConfig;     

    4.                

    5. int TIMflag = 0, PA12flag = 0;  

    6. int TIMcnt = 0, PA12cnt = 0, totalcnt = 0;  

    7.    

    8. void TIM3_IRQHandler(void){  

    9.     HAL_TIM_IRQHandler(&TIM_Handle);  

    10. }  

    11.    

    12. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){     

    13.     TIMflag = 1;  

    14.               TIMcnt++;  

    15. }  

    6. 编写完整的码表程序,PA12的按钮表示车轮转了一圈,通过计数器可以得到里程,通过定时器中断得到的时间可以计算出速度;PA11的按钮切换模式,模式一在串口输出里程,模式二在串口输出速度。

    在main函数中实现码表程序:

    1. while (1)  

    2.   {  

    3.   /* USER CODE END WHILE */  

    4.   /* USER CODE BEGIN 3 */  

    5.               if(TIMflag == 1){  

    6.                             TIMflag = 0;  

    7.               if(TIMcnt == 5){每五个周期输出一次  

    8.                      speed = 2 * PA12cnt / 1;//五个周期为1秒,车轮周长2米  

    9.                      TIMcnt = 0;  

    10.    

    11.               if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11))  

    12.                      mode = 1 - mode;//PA11按钮负责模式切换  

    13.               switch(mode){  

    14.                      case 0:  

    15.                             size = sprintf(str, "Speed : %f \r\n",speed);//输出速度  

    16.                             HAL_UART_Transmit(&UartHandle, (uint8_t*)str, size, 500);  

    17.                             break;  

    18.                      case 1:  

    19.                             size = sprintf(str, "Mileage: %d \r\n", 2 * totalcnt);//输出里程  

    20.                             HAL_UART_Transmit(&UartHandle, (uint8_t*)str, size, 500);  

    21.                             break;  

    22.                      default:break;  

    23.                      }  

    24.                      PA12cnt = 0;  

    25.               } }  



    『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

    热门文章 更多
    浅谈msp430f5529入门(2)----时钟配置.例程分析