【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 Compiler62??戝import£???a??μ??aoˉ?
__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.pswp.cn/diannao/39630.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39630.shtml
英文地址,請注明出處:http://en.pswp.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…

車云匯的元宇宙之旅

在汽車行業持續迎來數字化和科技革新的今天&#xff0c;車云匯作為一個領先的汽車服務平臺&#xff0c;正通過探索元宇宙這一新興概念&#xff0c;將傳統服務與虛擬現實技術相結合&#xff0c;為車主提供全新的互動體驗和服務模式。這一創新不僅有望改變汽車行業的服務面貌&…

匿名內部類在Java編程中的應用與限制

匿名內部類在Java編程中的應用與限制 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 匿名內部類在Java編程中的應用與限制 1. 什么是匿名內部類&#xff1f;…

什么叫創世區塊、創世區塊有什么用、為什么需要創世區塊

創世區塊&#xff08;Genesis Block&#xff09;是任何區塊鏈技術中的第一個區塊&#xff0c;它是區塊鏈的起點&#xff0c;標志著該區塊鏈的誕生。在創世區塊之前沒有任何區塊存在&#xff0c;因此它沒有前一個區塊的哈希值&#xff0c;通常這個位置會被設置為零或者一個預定義…

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…

0052__windows下實現socketpair函數

windows下實現socketpair函數_socketpair windows 實現-CSDN博客 socketpair函數介紹及使用-CSDN博客

使用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…

工業路由器的應用

上文講了工業路由器與家用路由器的區別, 家用路由器的使用場景想必大家都不陌生&#xff0c;那么工業路由器可以具體應用在哪些領域呢&#xff1f; 工業路由器憑借其多接口、多協議、寬溫寬壓等工業設計特性&#xff0c;可以廣泛應用于各類工業化場景&#xff0c;為各類工業傳…

STM32中的I2S(Inter-IC Sound)接口和SA接口(Serial Audio Interface)的區別

STM32中的I2S&#xff08;Inter-IC Sound&#xff09;接口和SA接口&#xff08;這里的SA可能指的是SAI&#xff0c;Serial Audio Interface&#xff09;雖然都用于音頻數據傳輸&#xff0c;但它們在設計目標、功能特性和應用場景上存在一些區別&#xff1a; I2S (Inter-IC Sou…

STM32-I2C硬件外設

本博文建議與我上一篇I2C 通信協議??????共同理解 合成一套關于I2C軟硬件體系 STM32內部集成了硬件I2C收發電路&#xff0c;可以由硬件自動執行時鐘生成、起始終止條件生成、應答位收發、數據收發等功能&#xff0c;減輕CPU的負擔 特點&#xff1a; 多主機功能&#x…