【STM32入门教学】——串口、定时器与参考资料

机器人工程系列文章目录

这里罗列了系列文章链接


概念总述

STM入门教学

还没写完组里急用


文章目录

  • 机器人工程系列文章目录
    • 概念总述
    • STM入门教学
  • 前言
  • 串口
    • 串口的概念
    • cubemx
    • keil5
    • 实物实验
    • 关于cubemx生成逻辑
    • printf升级
    • usart.c
    • main.h
    • retarget.c
  • 定时器
    • 定时器的概念
    • cubemx
    • keil5
    • stm32f4xx_it.c
  • 关于参考资料
    • 参考库文件
    • 参考数据手册
    • 样例工程
    • 参考别人的工程


前言

咳咳,最近出差,手边没实物,实物演示等我回实验室慢慢更

串口

串口的概念

这个东西叫串口,也叫UART或者USART,他是实现单片机交互数据的一种方式,当然可以给你的电脑提供数据交互
在这里插入图片描述
观察他的接口上会写着TX(transmit)与RX(receive)两个引脚,分别是他的嘴巴(TX)和他的耳朵(RX),显而易见的是如果你希望让两个单片机进行交流,你需要让A设备的RX(耳朵)接上B的TX(嘴巴),而B设备的RX(耳朵)接上A的TX(嘴巴)

cubemx

我们首先打开cubemx文件,选择Connectivity中的USART1,并设置模式为Asynchronous,观察到右侧PA9与PA10被设置为了USART1的RX与TX,点击生成代码

在这里插入图片描述

keil5

打开main.c文件,并在main文件中相应位置添加
在这里插入图片描述

  /* USER CODE BEGIN 2 */uint8_t usart1_tx_buf[] = "Hello world\r\n";/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){HAL_UART_Transmit(&huart1, usart1_tx_buf, sizeof(usart1_tx_buf), 0xffff);HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */

编译并下载

实物实验

打开设备管理器,如果你已经正常安装了各个驱动设备,你大概能看见

打开XCOM,选择

按下单片机的RST按钮

关于cubemx生成逻辑

cubemx的功能是为了帮助你完成大部分的底层逻辑配置,并为提供大量的库函数支持。
通常cubemx会帮你修改你的工程和代码,考虑到用户和cubeMX修改的内容不同,所以文件做了区分,

对于cubeMX生成的文件而言

printf升级

HAL_UART_Transmit();看起来不是很好用,我们会想能不能像平常写C语言一样简单地输出字符。

首先打开usart.c,并在文件最下方加入

usart.c

/* USER CODE BEGIN 1 */
int sendchar (int ch){HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xffff);return ch;	
}
/* USER CODE END 1 */

以及main.h中加入

main.h

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

在文件管理器增加retarget.c文件,并用文本编辑器加入下述文字
在这里插入图片描述

retarget.c

#include <stdio.h>
#include <rt_misc.h>//#pragma import(__use_no_semihosting_swi)//ARM Compiler6²»¼戝import£¬¸ĎªςæµĄځªº¯ʽ
__asm(".global __use_no_semihosting");extern int  sendchar(int ch);  /* in Serial.c */
//extern int  getkey(void);      /* in Serial.c */
extern long timeval;           /* in Time.c   *///struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;int fputc(int ch, FILE *f) {return (sendchar(ch));
}//int fgetc(FILE *f) {
// return (sendchar(getkey()));  
//}int ferror(FILE *f) {/* Your implementation of ferror */return EOF;
}void _ttywrch(int ch) {sendchar (ch);
}void _sys_exit(int return_code) {while (1);    /* endless loop */
}

回到keil中,双击Application/User/Core,将retarget.c添加到工程中,当然你也可以靠keil中的新建文件去添加,可以自己试试
在这里插入图片描述

接下来你可以将while里的函数做一定替换,可以更加方便的完成通讯。

  /* USER CODE BEGIN 2 */uint8_t usart1_tx_buf[] = "Hello world\r\n";/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){printf("Hello World\r\n");//HAL_UART_Transmit(&huart1, usart1_tx_buf, sizeof(usart1_tx_buf), 0xffff);HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */

定时器

定时器的概念

比如你现在要看管一个锅炉,每一小时需要放气一次,放气的工作需要花费你一分钟。你会有以下几种情况

  1. 你可以拿着一个计时器,每当计满一小时后,你去放一次气,这样每次放气的循环会维持在61分钟,长期这么做设备可能就会出现损坏。
  2. 你可以估算下自己放气的时间,如果是一分钟的话,我用计时器计算59分钟,这样循环可以稳定在60分钟。
  3. 你现在不止有放气的一个任务,你还需要加煤,还需要加水,还需要写报告,而且每个任务消耗的你时间是不确定的,可能是2分钟,可能是10分钟。为了更准确保证一小时放一次气,你决定选一个闹钟,每一小时提醒你做一轮工作。

定时器的核心功能体现在可以保证任务按照一定频率的完成,实际上单片机运行过程中任务时长是不确定的,为了确定一个稳定的工作频率,定时器的引入是必须的。

cubemx

选择Timers中的TIM11,勾选Activated。
Prescaler中写为99,我们上一章设置主时钟为100Mhz,意味着单片机一刻时钟为0.01us,但通常高频会造成更高的能耗,因此需要根据实际需求进行降频并分配给子定时器。写为99实际为100,这是因为程序通常从0开始计数,因此100Mhz会被分频100转换为1Mhz,也就是1us作为时钟的一刻。
Counter Period设置为999,这意味着我们计数1000则重新开始计数,也就意味着这个定时器每1ms就会自动刷新一次。
在这里插入图片描述
这还不够,定时器会单独在那运行,但他不会提醒你,因此选择NVIC Setting中,设置定时器中断开启,这样每1ms都会被提醒完成一次工作。

在这里插入图片描述

keil5

所以中断会怎么被提醒去工作呢,在stm32

做如下修改

stm32f4xx_it.c

void TIM1_TRG_COM_TIM11_IRQHandler(void)
{/* USER CODE BEGIN TIM1_TRG_COM_TIM11_IRQn 0 */static uint32_t counter;counter++;if(counter>999)counter=0;printf("Hello World\r\n");/* USER CODE END TIM1_TRG_COM_TIM11_IRQn 0 */HAL_TIM_IRQHandler(&htim11);/* USER CODE BEGIN TIM1_TRG_COM_TIM11_IRQn 1 *//* USER CODE END TIM1_TRG_COM_TIM11_IRQn 1 */
}

关于参考资料

写到现在比较困惑的一个问题是,这些东西我怎么理解?有哪些功能?有哪些函数?通过ST官方文件我们可以做如下了解。

参考库文件

函数右键Go to the Definition可以进入库函数定义文件,可以阅读英文注释了解函数具体使用。

参考数据手册

cubemx的Help->Docs&Resources,会有大量的stm32数据手册,可以多多参考阅读。
Description of STM32F4 HAL and low-layer drivers

样例工程

除了上述文档,ST提供了相关的工程文件作为参考
通常目录会放在
C:\用户\STM32Cube\Repository
其中的文件夹中有对应版本库的相关资料,包含了大部分HAL库与LL库的使用范例,就不用头疼的全网找资料了(一个个打开来看看吧)
在这里插入图片描述

参考别人的工程

学习学习别人的工作,了解了解别人如何应用设备芯片,可以帮助你更快的搭建自己的工程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/39630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

带电池监控功能的恒流直流负载组

EAK的交流和直流工业电池负载组测试仪对于测试和验证关键电力系统的能力至关重要&#xff0c;旨在实现最佳精度。作为一家客户至上的公司&#xff0c;我们继续尽我们所能应对供应链挑战&#xff0c;以提供出色的交货时间&#xff0c;大约是行业其他公司的一半。 交流负载组 我…

时钟切换的代码

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 参考代码 描述 题目描述&#xff1a; 存在两个同步的倍频时钟clk0 clk1,已知clk0是clk1的二倍频&#xff0c;现在要设计一个切换电路&#xff0c;sel选择时候进行切换&#xff0c;要求没有毛刺。 信号示意图&…

学习springMVC

第四章 Spring MVC 第一节 Spring MVC 简介 1. Spring MVC SpringMVC是一个Java 开源框架&#xff0c; 是Spring Framework生态中的一个独立模块&#xff0c;它基于 Spring 实现了Web MVC&#xff08;数据、业务与展现&#xff09;设计模式的请求驱动类型的轻量级Web框架&am…

vue3源码(六)渲染原理-runtime-dom

1、从入口文件看实现 项目入口文件 import { createApp } from vue import ./style.css import App from ./App.vuecreateApp(App).mount(#app)文件位置core\packages\runtime-dom\src\index.ts 保证了render的唯一性 // // rendererOptions 是patchProp 和nodeOps的合集&a…

可视化低代码平台之:RayData光启元的震撼作品。

RayData家的可视化作品&#xff0c;贝格前端工场是经常碰到&#xff0c;制作十分的精良&#xff0c;业内很有影响力。他们也有自己的低代码平台&#xff0c;分为了桌面版和网页版&#xff0c;本期分享一下他们的作品。

彻底掌握 Git:从零基础到高级实战的全方位教程

文章目录 一、Git 简介二、安装 Git1. Windows2. macOS3. Linux 三、Git 基本概念四、初次使用 Git1. 配置 Git2. 创建一个新的 Git 仓库3. 克隆一个远程仓库4. 跟踪文件5. 提交变更6. 查看历史记录 五、Git 分支管理1. 创建和切换分支2. 合并分支3. 分支冲突 六、远程仓库1. 添…

to_json 出现乱码的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

国产分布式数据库灾备高可用实现

最近在进行核心业务系统的切换演练测试&#xff0c;就在想一个最佳的分布式数据库高可用部署方案是如何保证数据不丢、系统可用的&#xff0c;做到故障时候可切换、可回切&#xff0c;并且业务数据的一致性。本文简要介绍了OceanBase数据库和GoldenDB数据库在灾备高可用的部署方…

kafka的架构

一、架构图 Broker&#xff1a;一台 kafka 服务器就是一个 broker。一个kakfa集群由多个 broker 组成。一个 broker 可以容纳多个 topic。 Producer&#xff1a;消息生产者&#xff0c;就是向 kafka broker 发消息的客户端 Consumer&#xff1a;消息消费者&#xff0c;向 kafk…

深海电波,智能驾驭:海上发电系统中的先进网关技术

随着技术的不断演进&#xff0c;海上风电场逐渐走向深海&#xff0c;随之而来的高速通信保障成为一大难题。同时&#xff0c;海上风电特殊的环境与部署技术&#xff0c;也给运维带来了作业难、成本高、响应慢等困难。通过在沿海岸边建立高站&#xff0c;结合超远覆盖、载波聚合…

springboot java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver 应该如何解决

遇到的问题&#xff1a;项目中引用了外部的达梦jar包 在idea中正常使用 也能找到dm.jdbc.driver.DmDriver 驱动 但是当通过jenkins 构建部署到服务器上 总是报 ClassNotFoundException: dm.jdbc.driver.DmDriver 找不到驱动 应用到的驱动代码如下格式 排查步骤 1.首先看你的项…

ROS2仿真工具-gazebo

gazebo独立于ROS2&#xff0c;就像插件一样&#xff0c;需要安装。 1.安装 sudo apt install gazebo sudo apt install ros-humble-gazebo-* 2.运行测试demo gazebo /opt/ros/humble/share/gazebo_plugins/worlds/gazebo_ros_diff_drive_demo.world 查看所有话题 ros2 top…

使用css做一个旋转的八卦图

使用css做一个旋转的八卦图 1, html部分 <div class"tai"><div class"bai"></div><div class"hei"></div> </div>2, css部分 .tai{width: 200px;height: 200px;border: 1px solid #000;background: linea…

STM32-I2C硬件外设

本博文建议与我上一篇I2C 通信协议​​​​​​共同理解 合成一套关于I2C软硬件体系 STM32内部集成了硬件I2C收发电路&#xff0c;可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能&#xff0c;减轻CPU的负担 特点&#xff1a; 多主机功能&#x…

Shiro框架

入门概述 1 shiro是什么? Apache Shiro 是一个功能强大且易于使用的 Java 安全(权限)框架。Shiro 可以完成&#xff1a;认证、授权、加密、会话管理、与 Web 集成、缓存 等。借助 Shiro 您可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应用程…

计算机网络网络层复习题1

一. 单选题&#xff08;共27题&#xff09; 1. (单选题)以太网 MAC 地址、IPv4 地址、IPv6 地址的地址空间大小分别是&#xff08; &#xff09;。 A. 2^48&#xff0c;2^32&#xff0c;2^128B. 2^32&#xff0c;2^32&#xff0c;2^96C. 2^16&#xff0c;2^56&#xff0c;2^6…

浅谈k8s中cni0和docker0的关系和区别

最近在复习k8s网络方面的知识&#xff0c;查看之前学习时整理的笔记和文档还有过往自己总结的博客之后发现一个问题&#xff0c;就是在有关flannel和calico这两个k8s网络插件的文章和博客中&#xff0c;会涉及到cni0和docker0这两个网桥设备&#xff0c;但是都没有明确说明他们…

C# WPF自制批注工具(方便标记重点和演示)

在教学和演示中&#xff0c;我们通常需要对重点进行批注&#xff0c;下载安装第三方工具批注显得很麻烦。本篇使用WPF开发了一个批注工具&#xff0c;工具小巧&#xff0c;功能丰富&#xff0c;非常使用日常免费使用&#xff0c;或者进行再次开发。 自制批注工具具有以下功能特…

Flask 数据创建时出错

当我们在使用 Flask 创建数据时遇到错误&#xff0c;可能有多种原因&#xff0c;包括代码错误、数据库配置问题或依赖项错误。具体情况我会总结成一篇文章记录下&#xff0c;主要是归类总结一些常见的解决方法和调试步骤&#xff0c;帮助大家解决问题&#xff1a; 1、问题背景 …

OFDM技术概述8——FBMC

Filter bank multicarrier(FBMC&#xff0c;滤波器组多载波)&#xff0c;是一种类似于OFDM的调制方式&#xff0c;用滤波器抑制子载波的旁瓣大小&#xff0c;使用FFT/IFFT或多相滤波器实现&#xff0c;其应用于5G的主要优势&#xff1a; 子载波信号带限&#xff0c;带外泄漏小…