STM32單片機C語言

1、stdint.h簡介
stdint.h 是從 C99 中引進的一個標準 C 庫的文件
路徑:D:\MDK5.34\ARM\ARMCC\include
大家都統一使用一樣的標準,這樣方便移植
在這里插入圖片描述
配置MDK支持C99
在這里插入圖片描述

位操作

在這里插入圖片描述

如何給寄存器某個值賦值

舉個例子:uint32_t temp = 0;
在這里插入圖片描述
在這里插入圖片描述

宏定義

在這里插入圖片描述

帶參數的宏定義

https://blog.csdn.net/xiaoyilong2007101095/article/details/77067686
去看一下宏定義

#define LED1(x)   do{  x ? \HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_SET) : \HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_RESET); \}while(0)

建議大家使用 do{ ... }while(0) 來 構造宏定義,這樣不會受到大括號、分號、運算符優先級等的影響,總是會按你期望的方式調用運行!

假設LED1(1)參數為真 ,那么就執行第一句,如果是LED1(0),那么就執行第二句

條件編譯

讓編譯器只對滿足條件的代碼進行編譯,不滿足條件的不參與編譯!
在這里插入圖片描述
在這里插入圖片描述

extern聲明

在這里插入圖片描述

類型別名(typedef)

為現有數據類型創建一個新的名字,或稱為類型別名,用來簡化變量的定義

/*typedef   現有類型   新名字*/
typedef  unsigned  char uint8_t;
typedef  unsigned  short int uint16_t;
typedef  unsigned  int uint32_t;

類型別名應用
下面是結構體應用typedef

struct GPIO_TypeDef
{__IO uint32_t   CRL;__IO uint32_t   CRH;//…
};
struct GPIO_TypeDef gpiox;   //聲明typedef struct
{__IO uint32_t   CRL;__IO uint32_t   CRH;//…
} GPIO_TypeDef;
GPIO_TypeDef gpiox;  //聲明

在C中定義一個結構體類型要用typedef:

typedef struct Student
{int a;
}Stu;

于是在聲明變量的時候就可:Stu stu1;
如果沒有typedef就必須用struct Student stu1;來聲明
這里的Stu實際上就是struct Student的別名。
另外這里也可以不寫Student(于是也不能struct Student stu1;了)

typedef struct
{int a;
}Stu;

但在c++里很簡單,直接

struct Student
{int a;
};

于是就定義了結構體類型Student,聲明變量時直接Student stu2;
2其次:
在c++中如果用typedef的話,又會造成區別:

struct Student
{int a;
}stu1;//stu1是一個變量
typedef struct Student2
{int a;
}stu2;//stu2是一個結構體類型

使用時可以直接訪問stu1.a
但是stu2則必須先 stu2 s2;
然后 s2.a=10;

3 掌握上面兩條就可以了,不過最后我們探討個沒多大關系的問題
如果在c程序中我們寫:

typedef struct
{int num;int age;
}aaa,bbb,ccc;

結構體

由若干基本數據類型集合組成的一種自定義數據類型,也叫聚合類型

struct   結構體名
{成員列表;
} 變量名列表(可選)
struct student
{char  	*name;		/* 姓名 */int     	num;  		/* 學號 */int     	age; 			/* 年齡 */char	group;  		/* 所在學習小組 */float  	score;  		/* 成績 */
}stu1, stu2;

應用舉例(定義&使用)

struct student
{char  	*name;		/* 姓名 */int     	num;  		/* 學號 */int     	age; 			/* 年齡 */char	group;  		/* 所在學習小組 */float  	score;  		/* 成績 */
};struct student stu3,stu4;
stu3.name = "張三";
stu3.num = 1; 
stu3.age = 18; 
stu3.group = 'A';
stu3.score = 80.9;

用上typedef

typedef struct
{char  	*name;		/* 姓名 */int     	num;  		/* 學號 */int     	age; 			/* 年齡 */char	group;  		/* 所在學習小組 */float  	score;  		/* 成績 */
}student;student stu3,stu4;
stu3.name = "張三";
stu3.num = 1; 
stu3.age = 18; 
stu3.group = 'A';
stu3.score = 80.9;

應用舉例(ST源碼,使用類型別名)

typedef struct
{uint32_t 	Pin ;		/* 引腳號 */uint32_t 	Mode ;	/* 工作模式 */uint32_t 	Pull ;          /* 上下拉 */uint32_t 	Speed ;	/* IO速度 */
} GPIO_InitTypeDef;

指針

指針就是內存的地址
指針變量是保存了指針的變量
類型名 * 指針變量名

char * p_str = “This is a test!; 
//*p_str:*是間接尋址運算符,取p_str變量的值,p_str是指針,*p_str就是取指針p_str指向的地址的值,實際就是'T'
//p_str是地址,p_str[0] 和 *p_str 一樣都是 'T'
//&p_str:取p_str變量的地址,取指針的地址
舉例
uint8_t  buf[5] = {1, 3, 5, 7, 9}; 
uint8_t  * p_buf = buf;
*p_buf = ? 
p_buf[0] = ?
p_buf[1] = ?
p_buf++;
*p_buf = ?
p_buf[0] = ?

在這里插入圖片描述

uint8_t  buf[5] = {1, 3, 5, 7, 9};  //假設此時buf的首地址為0x0002
uint8_t  * p_buf = buf;   //此時指針指向地址0x0002
//下面就是答案
*p_buf = 1   //此時 p_buf和buf一樣指向地址為0x0002的空間
p_buf[0] = 1
p_buf[1] = 3
p_buf++;    //此時指針指向地址0x0003
*p_buf = 3  //此時指針指向地址0x0003
p_buf[0] = 3  //此時指針指向地址0x0003
指針使用的2大最常見問題

1,未分配(申請)內存就用
2,越界使用

//錯誤用法(未分配內存)
char * p_buf;
p_buf[0] = 100;
p_buf[1] = 120;
p_buf[2] = 150;
//錯誤用法(越界使用)
uint8_t  buf[5] = {1, 3, 5, 7, 9}; 
uint8_t  * p_buf = buf;
p_buf[5] = 200;
p_buf[6] = 250;

嵌入式單片機 C代碼規范與風格

規范的關鍵點:

  1. 所有函數/變量名字非特殊情況,一般使用小寫字母;
  2. 注釋風格使用 doxgen 風格,除屏蔽外,一律使用 /* */ 方式進行注釋;
  3. TAB 鍵統一使用 4 個空格對齊,不使用默認的方式進行對齊;
  4. 每兩個函數之間,一般有且只有一個空行;
  5. 相對獨立的程序塊之間,使用一個空行隔開;
  6. 全局變量命名一般用 g_開頭,全局指針命名一般用 p_開頭;
  7. if、 for、 while、 do、 case、 switch、 default 等語句單獨占一行,
    一般無論有多少行執行語句,都要用加括號: {}。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77408.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77408.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77408.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【專題刷題】雙指針(四):最接近的三數之和,接雨水

📝前言說明: 本專欄主要記錄本人的基礎算法學習以及LeetCode刷題記錄,按專題劃分每題主要記錄:(1)本人解法 本人屎山代碼;(2)優質解法 優質代碼;&#xff…

chili3d調試筆記3 加入c++ 大模型對話方法 cmakelists精讀

加入 #include <emscripten/bind.h> #include <emscripten/val.h> #include <nlohmann/json.hpp> 怎么加包 函數直接用emscripten::function&#xff0c;如&#xff1a; emscripten::function("send_to_llm", &send_to_llm); set (CMAKE_C…

[Redis]1-高效的數據結構P2-Set

按照慣例&#xff0c;先丟一個官網文檔鏈接。 上篇我們已經了解了高效的數據結構P1-String與Hash。 這篇&#xff0c;我們繼續來了解Redis的 Set 與 Sorted set。 目錄 有序集合 Sorted set底層實現 集合 Set總結資料引用 有序集合 Sorted set Redis 有序集合是一組唯一的字符…

Python + Playwright:使用正則表達式增強自動化測試

Python + Playwright:使用正則表達式增強自動化測試 前言一、 為什么選擇正則表達式?二、 Playwright 中集成正則表達式:途徑與方法三、 實戰應用:正則表達式解決典型測試難題場景 1:定位 ID 或 Class 包含動態部分的元素場景 2:驗證包含可變數字或文本的提示信息場景 3:…

VASP 6.4.1 Ubuntu系統編譯安裝手冊

VASP 6.4.1 Ubuntu系統編譯安裝手冊 &#xff08;基于Ubuntu 22.04 LTS&#xff0c;適用x86_64架構&#xff09; 文章目錄 VASP 6.4.1 Ubuntu系統編譯安裝手冊第一章 系統環境深度配置1.1 硬件兼容性驗證1.2 操作系統環境準備1.3 數學庫深度優化配置 第二章 編譯環境深度調優2…

uniapp h5接入地圖選點組件

uniapp h5接入地圖選點組件 1、申請騰訊地圖key2、代碼接入2.1入口頁面 &#xff08;pages/map/map&#xff09;templatescript 2.2選點頁面&#xff08;pages/map/mapselect/mapselect&#xff09;templatescript 該內容只針對uniapp 打包h5接入地圖選點組件做詳細說明&#x…

java輸出、輸入語句

先創建一個用于測試的java 編寫程序 #java.util使java標準庫的一個包&#xff0c;這里拉取Scanner類 import java.util.Scanner;public class VariableTest {public static void main(String[] args) {#創建一個 Scanner 對象Scanner scanner new Scanner(System.in);System.…

AI Agents系列之構建多智能體系統

&#x1f9e0; 向所有學習者致敬&#xff01; “學習不是裝滿一桶水&#xff0c;而是點燃一把火。” —— 葉芝 我的博客主頁&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 歡迎點擊加入AI人工智能社區&#xff01; &#x1f680; 讓我們一起努力&#xff0c;共創…

04.Spring 框架注解體系詳解

Spring 框架注解體系詳解 本文詳細介紹 Spring、Spring Boot 及 Spring Cloud 中常用注解的用途、生命周期及使用方式&#xff0c;幫助開發者更深入理解 Spring 注解驅動編程模式。 參考來源&#xff1a;Spring、SpringMVC、SpringBoot、SpringCloud 框架常用注解說明 目錄 注…

手撕STL——vector

目錄 引言 1&#xff0c;了解 STL 中的 vector 2&#xff0c;先來一個簡易版跑起來 2_1&#xff0c;構造函數 2_2&#xff0c;擴容reserve&#xff08;&#xff09; 2_3&#xff0c;push_back&#xff08;&#xff09; 2_4&#xff0c;pop_back&#xff08;&#xff09; …

優恩-具備浪涌保護功能的固態繼電器UNRD0610-無觸點開關器件?

MOSFET固態繼電器 : 最高負載電壓&#xff1a;60V 最大負載電流&#xff1a;10A 快速響應時間&#xff1a;≤1ms 低驅動電流&#xff1a;≤10mA 高絕緣性&#xff0c;輸入輸出間隔離電壓&#xff1a;AC3000V 耐脈沖浪涌沖擊能力強 符合IEC 61000-4-2 ESD標準&#xff1a…

Kaamel隱私與安全分析報告:Microsoft Recall功能評估與風險控制

本報告對Microsoft最新推出的Recall功能進行了全面隱私與安全分析。Recall是Windows 11 Copilot電腦的專屬AI功能&#xff0c;允許用戶以自然語言搜索曾在電腦上查看過的內容。該功能在初次發布時因嚴重隱私和安全問題而備受爭議&#xff0c;后經微軟全面重新設計。我們的分析表…

Kotlin協程Semaphore withPermit約束并發任務數量

Kotlin協程Semaphore withPermit約束并發任務數量 import kotlinx.coroutines.* import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.sync.withPermit import kotlinx.coroutines.launch import kotlinx.coroutines.runBlockingfun main() {val permits 1 /…

鴻蒙語言基礎

準備工作 去鴻蒙官網下載開發環境 點擊右側預瀏覽&#xff0c;刷新和插銷按鈕&#xff0c;插銷表示熱更新&#xff0c;常用按鈕。 基礎語法 string number boolean const常量 數組 let s : string "1111"; console.log("string", s);let n : number …

C++數據結構與二叉樹詳解

前言&#xff1a; 在C編程的世界里&#xff0c;數據結構是構建高效程序的基石&#xff0c;而二叉樹則是其中最優雅且應用廣泛的數據結構之一。本文將帶你深入理解二叉樹的本質、實現與應用&#xff0c;助你在算法設計中游刃有余。 一、二叉樹的基本概念 1. 什么是二叉樹 二叉樹…

淺析數據庫面試問題

以下是關于數據庫的一些常見面試問題: 一、基礎問題 什么是數據庫? 數據庫是按照數據結構來組織、存儲和管理數據的倉庫。SQL 和 NoSQL 的區別是什么? SQL 是關系型數據庫,使用表結構存儲數據;NoSQL 是非關系型數據庫,支持多種數據模型(如文檔型、鍵值對型等)。什么是…

piamon實戰-- 如何使用 Paimon 的 Java API 實現數據的點查

簡介 Apache Paimon(原 Flink Table Store)是一款基于流批一體架構的 ??高性能數據湖存儲框架??,支持低延遲的數據更新、實時查詢和高效的鍵值點查(Point Lookup)。 本文將深入解析 Paimon 的點查機制,并通過 Java API 代碼案例演示如何實現數據的點查功能。 一、Pai…

社交媒體時代的隱私憂慮:聚焦Facebook

在數字化時代&#xff0c;社交媒體平臺已成為人們日常生活的重要組成部分。Facebook作為全球最大的社交媒體之一&#xff0c;擁有數十億用戶&#xff0c;其對個人隱私的影響和憂慮也日益凸顯。本文將探討社交媒體時代下&#xff0c;尤其是Facebook平臺上的隱私問題。 數據收集…

問題:el-tree點擊某節點的復選框由半選狀態更改為全選狀態以后,點擊該節點展開,懶加載出來子節點數據以后,該節點又變為半選狀態

具體問題場景&#xff1a; 用戶點擊父節點復選框將其從半選變為全選&#xff08;此時子節點尚未加載&#xff09;。 點擊節點展開觸發懶加載&#xff0c;加載子節點。 子節點加載后&#xff0c;組件重新計算父節點狀態&#xff0c;發現并非所有子節點被選中&#xff0c;因此父節…

FastGPT安裝前,系統環境準備工作?

1.啟用適用于 Linux 的 Windows 子系統 方法一&#xff1a;打開控制面板 -> 程序 -> 啟用或關閉Windows功能->勾選 “適用于Linux的Vindows子系統” 方法二&#xff1a;以管理員身份打開 PowerShell&#xff08;“開始”菜單 >“PowerShell” >單擊右鍵 >“…