自行车码表

一、      实验目的和要求

1.    理解MCU上电启动过程;

2.    掌握使用Cube库来编写STM32裸机程序的方法;

3.    掌握使用Cube库来编写GPTO和UART程序的方法;

4.    掌握使用Cube库来编写中断响应程序的方法;

5.    理解前后台程序模式

6.    掌握在STM32F103上编写裸机程序并下载运行的方法。

二、      实验器材

1.    STM32F103核心板一块;

2.    MicroUSB线一根;

3.    STLink板或USB串口板一块;

4.    交叉编译软件

 

三、      实验内容和原理

1.编写Cube程序,配置UART0为9600,8n1,上电后向串口输出“Hello”,在PC上通过串口软件观察结果

2.通过面包板在PA11和PA12各连接一个按钮开关到地

3.编写Cube程序,配置PA11和PA12为内部上拉到输入模式,在main()函数循环检测PA11按钮按下,并在按钮按下时在串口输出Pressed。

4.编写Cube程序,配置PA12下降沿触发中断,程序中设置两个全局变量,一个为计数器,一个为标识。当中断触发时,计数器加1,并设置标识。在主循环中判断标识,如果标识置位则清除标识并通过串口输出计数值;

5.编写Cube程序,开启定时器为200ms中断一次,中断触发时设置标识,主循环根据这个标识来做串口输出(取消4的串口输出);

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

四、      实验过程和数据记录

1.    下列图片为实物连接图

其中串口使用PA9,PA10;GPIO使用PA11,PA12,分别连接按钮。黑线接地。

2.    在Cube软件中配置UART0的波特率为9600, 8n1,然后向串口输出Hello,通过Mac上的串口软件观察结果。

a.    下图为配置图片,将波特率设置为9600,8n1.

b.    配置完成后,我们就可以用HAL_UART_Transmit和HAL_UART_Receive两个函数来进行串口的收发数据。使用GNUC需要重写__io_putchar和fputc函数,我们通过宏定义来完成。

c.    测试串口输出,在while循环前添加printf函数来输出Hello

d.    下面是实验结果展示图

3.    编写Cube程序,配置PA11和PA12为内部上拉到输入模式,在main()函数循环检测PA11按钮按下,并在按钮按下时在串口输出Pressed

a.    首先配置PA11和PA12为内部上拉到输入模式,如下图所示

b.    在while循环中写出如果按下按钮,则在串口输出Pressed字样,循环代码如下图所示

c.    下面是输出图示

4.    编写Cube程序,配置PA12下降沿触发中断,程序中设置两个全局变量,一个为计数器,一个为标识。当中断触发时,计数器加1,并设置标识。在主循环中判断标识,如果标识置位则清除标识并通过串口输出计数值

a.    配置PA12下降沿触发中断,配置过程如下

b.    设置两个全局变量stopwatch_counter和stopwatch_flag,并且实现HAL_GPIO_EXTI_Callback(unit16_tGPIO_Pin)函数,函数实现如下

c.    在while循环中,通过判断全局变量stopwatch_flag的值,来判断中断是否发生,代码实现如下

d.    成功编译之后下载到板子上,运行结果如下图所示

5.    编写Cube程序,开启定时器为200ms中断一次,中断触发时设置标识,主循环根据这个标识来做串口输出(取消4的串口输出)

a.    配置时钟信息如下

b.    实现HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)函数,用来设置标识符

c.    在main函数初始化定时器,并且根据stopwatch_flag来判断中断是够发生。实现代码如下

d.    在串口软件监测到如下结果

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

a.    在计算速度和里程的过程中,里程默认中断一次为1m,速度计算公式为stopwatch_mile*18/stopwatch_time,stopewatch_time为添加的全局变量,表示定时器的中断次数。

b.    完整代码如下


/**

  ******************************************************************************

  * File Name          : main.c

  * Description        : Main program body

  ******************************************************************************

  *

  * COPYRIGHT(c) 2016 STMicroelectronics

  *

  * Redistribution and use in source and binary forms, with or without modification,

  * are permitted provided that the following conditions are met:

  *   1. Redistributions of source code must retain the above copyright notice,

  *      this list of conditions and the following disclaimer.

  *   2. Redistributions in binary form must reproduce the above copyright notice,

  *      this list of conditions and the following disclaimer in the documentation

  *      and/or other materials provided with the distribution.

  *   3. Neither the name of STMicroelectronics nor the names of its contributors

  *      may be used to endorse or promote products derived from this software

  *      without specific prior written permission.

  *

  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"

  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE

  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE

  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR

  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER

  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,

  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE

  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

  *

  ******************************************************************************

  */

/* Includes ------------------------------------------------------------------*/

#include "stm32f1xx_hal.h"

 

/* USER CODE BEGIN Includes */

 

/* USER CODE END Includes */

 

/* Private variables ---------------------------------------------------------*/

TIM_HandleTypeDef htim2;

 

UART_HandleTypeDef huart1;

 

/* USER CODE BEGIN PV */

/* Private variables ---------------------------------------------------------*/

 

int stopwatch_counter;

int stopwatch_flag;

int stopwatch_time;

int stopwatch_mode;

 

/* USER CODE END PV */

 

/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_USART1_UART_Init(void);

static void MX_TIM2_Init(void);

 

/* USER CODE BEGIN PFP */

/* Private function prototypes -----------------------------------------------*/

#ifdef __GNUC__

/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf

   set to ‘Yes‘) calls __io_putchar() */

#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

#else

#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

#endif /* __GNUC__ */

 

/* USER CODE END PFP */

 

/* USER CODE BEGIN 0 */

 

/* USER CODE END 0 */

 

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_USART1_UART_Init();

  MX_TIM2_Init();

 

  /* USER CODE BEGIN 2 */

            GPIO_PinState key;

            HAL_TIM_Base_Start_IT(&htim2);

            printf("Hello\n\r");

           

            double mile = 0;

            double speed = 0;

           

 

  /* USER CODE END 2 */

 

  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

           

  while (1)

  {

  /* USER CODE END WHILE */

 

  /* USER CODE BEGIN 3 */

                       

                        key = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11);

                        if (key == GPIO_PIN_RESET)

                        {

                                    stopwatch_mode = !stopwatch_mode;

                        }

                        if (stopwatch_flag == 1)

                        {

                                    stopwatch_flag = 0;

                                   

                                    mile = stopwatch_counter * 1;

                                    if (stopwatch_mode == 0)

                                    {

                                                printf("Current Mile: %f\n\r", mile);

                                    }

                                    else

                                    {

                                                speed = stopwatch_counter  / stopwatch_time;

                                                printf("Current Speed: %1f\n\r", speed);

                                    }

                        }

                        HAL_Delay(100);

                       

 

  }

  /* USER CODE END 3 */

 

}

 

/** System Clock Configuration

*/

void SystemClock_Config(void)

{

 

  RCC_OscInitTypeDef RCC_OscInitStruct;

  RCC_ClkInitTypeDef RCC_ClkInitStruct;

 

  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);

 

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;

  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);

 

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

 

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

 

  /* SysTick_IRQn interrupt configuration */

  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

}

 

/* TIM2 init function */

void MX_TIM2_Init(void)

{

 

  TIM_ClockConfigTypeDef sClockSourceConfig;

  TIM_MasterConfigTypeDef sMasterConfig;

 

  htim2.Instance = TIM2;

  htim2.Init.Prescaler = 8000;

  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;

  htim2.Init.Period = 199;

  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

  HAL_TIM_Base_Init(&htim2);

 

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;

  HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig);

 

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

  HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);

 

}

 

/* USART1 init function */

void MX_USART1_UART_Init(void)

{

 

  huart1.Instance = USART1;

  huart1.Init.BaudRate = 9600;

  huart1.Init.WordLength = UART_WORDLENGTH_8B;

  huart1.Init.StopBits = UART_STOPBITS_1;

  huart1.Init.Parity = UART_PARITY_NONE;

  huart1.Init.Mode = UART_MODE_TX_RX;

  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

  huart1.Init.OverSampling = UART_OVERSAMPLING_16;

  HAL_UART_Init(&huart1);

 

}

 

/** Configure pins as

        * Analog

        * Input

        * Output

        * EVENT_OUT

        * EXTI

*/

void MX_GPIO_Init(void)

{

 

  GPIO_InitTypeDef GPIO_InitStruct;

 

  /* GPIO Ports Clock Enable */

  __HAL_RCC_GPIOA_CLK_ENABLE();

 

  /*Configure GPIO pin : PA11 */

  GPIO_InitStruct.Pin = GPIO_PIN_11;

  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

  GPIO_InitStruct.Pull = GPIO_PULLUP;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 

  /*Configure GPIO pin : PA12 */

  GPIO_InitStruct.Pin = GPIO_PIN_12;

  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;

  GPIO_InitStruct.Pull = GPIO_PULLUP;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 

  /* EXTI interrupt init*/

  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);

  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

 

}

 

/* USER CODE BEGIN 4 */

PUTCHAR_PROTOTYPE

{

  /* Place your implementation of fputc here */

  /* e.g. write a character to the USART1 and Loop until the end of transmission */

  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

 

  return ch;

}

 

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

            if (GPIO_Pin == GPIO_PIN_12)

            {

                        stopwatch_counter += 1;

//                      stopwatch_flag = 1;

            }

}

 

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

            if (htim->Instance == TIM2)

            {

                        stopwatch_flag = 1;

                        stopwatch_time += 1;

            }

           

}

 

 

/* USER CODE END 4 */

 

#ifdef USE_FULL_ASSERT

 

/**

   * @brief Reports the name of the source file and the source line number

   * where the assert_param error has occurred.

   * @param file: pointer to the source file name

   * @param line: assert_param error line source number

   * @retval None

   */

void assert_failed(uint8_t* file, uint32_t line)

{

  /* USER CODE BEGIN 6 */

  /* User can add his own implementation to report the file name and line number,

    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* USER CODE END 6 */

 

}

 

#endif

 

/**

  * @}

  */

 

/**

  * @}

*/

 

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

c.    下面是实验结果图展示

7.    扩展内容

a.    扩展内容由于工程具有完整性,故统一完成如下

b.    Main函数中代码较为简单,为休眠操作,由于SysTick中断也会终止休眠,故应该关掉中断。


int main(void)

{

  HAL_Init();

 

  /* Configure the system clock */

  SystemClock_Config();

 

  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_USART1_UART_Init();

  MX_TIM2_Init();

 

  /* USER CODE BEGIN 2 */

            GPIO_PinState key;

            HAL_TIM_Base_Start_IT(&htim2);

            printf("Hello\n\r");

           

  /* USER CODE END 2 */

  while (1)

  {

  /* USER CODE END WHILE */

 

  /* USER CODE BEGIN 3 */

                       

                        HAL_SuspendTick();

                        __HAL_RCC_PWR_CLK_ENABLE();

                        HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);

                        HAL_ResumeTick();

  }

  /* USER CODE END 3 */

 

}

c.    下面是中断处理函数的修改


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

           

           

            double mile = 0;

            double speed = 0;

           

           

            if (htim->Instance == TIM2)

            {

//                      stopwatch_flag = 1;

                        stopwatch_time += 1;

                       

                        mile = stopwatch_counter*1;

                        if (stopwatch_mode == 0)

                        {

                                    printf("Current Mile: %f\n\r", mile);

                        }

                        else

                        {

                                    speed = (double)stopwatch_counter / stopwatch_time;

                                    printf("Current Speed: %1f\n\r", speed);

                        }

            }

           

}

d.    下面是实验结果图

可以看出和之前实验的输出结果相类似,实验成功。

时间: 2024-10-13 00:11:28

自行车码表的相关文章

嵌入式开发之 STM32自行车码表(图文)

笔者将从以下几个方面逐步深入地讲解STM32F103C8开发板的使用,并在Windows下编写一个简单的自行车码表程序: 元器件 环境搭建 电路连接 一个简单的LED闪烁程序 自行车码表 准备工作之 元器件 准备工作之 电路连接 准备工作之 环境搭建 CubeMX配置 KeilST-LINK下载程序调试程序 下载并注册安装Keil Keil安装程序及注册机 用keil打开CubeMX生成的工程文件 build keilST-LINK下载和调试以blink为例 出错误了 解决方法一 解决方法二 连

嵌入式 LAB 3:自行车码表

前期工作准备 Mac OS X + Windows 7虚拟机 安装STM32 ST-LINK Unity.用于烧录程序. 安装STM32 ST-LINK所需要的驱动 安装Keil UVision 5,这是IDE,可以生成Hex文件,也可以烧录到板子上. 安装USB-TTL所以需要的驱动. 安装PUTTY,Windows下查看串口. 器材准备 STM32F103板子一个 杜邦线.面包线若干 ST-LINK V2 USB-TTL 按钮两个.面包板两个 Hex文件生成 切换成MDK-ARM 一定要选择

Bluemix公有云入华,IBM加入云大战,祭出三大杀器

(上图为IBM大中华区董事长陈黎明揭开了Bluemix公有云落地中国的大幕) 中国和印度正在成为全球炙手可热的云计算厂商争夺之地.根据451 Research在今年9月发布的调研数据,在两地有近200家云服务商,向本地客户提供IaaS.PaaS和SaaS服务.451 Research预测中国到2020年将创造159亿美元的云计算市场,而Gartner预测到2020年全球云计算市场营收为1435.3亿美元,也就是说届时中国将占全球云计算市场11%的份额. 2016年10月19日,IBM宣布正式与中

IBM的大数据云江湖,谁是新盟主?

大家都知道,在传统IT时代,数据库三巨头有IBM.Oracle和微软.在三巨头中,IBM可以说是绝对的数据库巨头,1968年就研发出了世界上第一个层次型数据库管理系统IMS,1970年IBM专家首次提出了数据关系模型的概念,1974年又提出了一种新型的数据查询语言也就是后来SQL的前身,1983年IBM发布了著名的DB2数据库,2001年以10亿美金收购了Informix. 然而到了云计算和大数据时代,一时风云变化.Hadoop和Spark等开源大数据存储与处理技术的崛起,导致了全球数据库市场格

智能可穿戴平台,你更看好谁?

随着可穿戴设备大潮来袭,众巨头纷纷布局可穿戴.6月,苹果发布了Healthkit平台,谷歌则发布了AndroidWare平台,日前,腾讯(微信)的智能硬件计划曝光.前两者从系统层面出发,都希望自己成为可穿戴行业的规则制定者,腾讯则依托微信这个大杀器,为硬件公司提供了一个新的选择. 苹果Healthkit HealthKit是苹果在iOS 8中新推出的健康信息管理系统,它可以整合iPhone或iPad上其它健康应用收集的数据,如血压和体重等.它能利用多种指标(如睡眠.运动,等等)追踪.记录和分析用

最全电商分类信息(03)

ID 上级ID 分类名称 分类等级 是否最终分类 2001 9708 其他运动包 2 1 2002 9708 运动钱包/卡包/钥匙包 2 1 2003 9708 运动手提包 2 1 2004 9708 运动双肩包 2 1 2005 9708 运动桶包 2 1 2006 9708 运动腰包 2 1 2007 9839 其他球类运动 2 1 2008 9886 麦克风 2 1 2009 9634 网线 1 1 2010 9842 数码相框 2 1 2011 10555 眼部卸妆 3 1 2012 9

奇思妙想——我心中的智能自行车

看到国内炒的很火的智能自行车,骑车的我有了一些想法: 我不想换掉我自己组装的自行车,但是我想我需要一些智能自行车的功能. 智能自行车传感器之类的都是嵌入自行车的,要是坏了肿么办? 需要的功能: 导航 踏频.速度.记录距离等. 记录上传保存. 定位. 怎么样不换车还能用一些智能自行车的功能呢?我的想法: 改造码表,使之可以把踏频.速度等数据可以传输至手机(最好是用无线的),使用手机APP显示当前数据(当然也可以用可穿戴产品例如:苹果婊等). 这样就可以集成许多智能的功能了,手机和码表结合,个人赶脚

编码表

常见的编码表: ASCII 美国标准信息交换码,用一个字节的7位表示 ISO-8859-1  拉丁码表,欧洲码表,用一个字节的全部8位表示 GB2312:中国的中文码表 GBK:GB2312的升级,融合了更多的中文文字符号 Unicode:国际标准码,融合了多种文字,所有文字都是使用两个字节来表示,java就是使用Unicode编码表 UTF-8:最多用三个字节来表示一个字符.如果能用一个字节来装,就使用一个字节,一个装不下,就用两个字节,最多三个字节 string s="你好"; b

第11周项目5摩托车继承自行车和机动车

/* *Copyright (c) 2016,烟台大学计算机学院 *All rights reserved. *文件名称 : *作 者 : 刘云 *完成日期 : 2016年5月8号 *版 本 号 : v6.0 * *问题描述 : 摩托车继承自行车和机动车 *输入描述 : 无 *程序输出 : */ #include <iostream> #include<iostream> #include<conio.h> #include <windows.h> usin