日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

01、【正点原子】sys.c、sys.h位带操作的简单应用

發布時間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 01、【正点原子】sys.c、sys.h位带操作的简单应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 一、前言
  • 二、個人理解
  • 三、代碼呈現

一、前言

由于本人跟著江科大自化協學習stm32c8t6最小系統板,在瀏覽其他人代碼的時候,發現大佬都喜歡使用位帶操作,通過正點原子官方視頻學習之后,發現這就是庫函數的一種使用。

二、個人理解

位帶操作主要是對GPIO口的操作,是將一些寄存器地址通過封裝、映射,使之形成與51單片機類似的寄存器操作,但之前也同樣需要對IO進行初始化。

三、代碼呈現

本代碼截取于正點原子的戰艦v3(也是精英版的)第十五講-手把手編寫跑馬燈實驗-位操作

sys.c 這個可以先不研究

#include "sys.h"// //本程序只供學習使用,未經作者許可,不得用于其它任何用途 //ALIENTEK Mini STM32開發板 //系統中斷分組設置化 //正點原子@ALIENTEK //技術論壇:www.openedv.com //修改日期:2012/9/10 //版本:V1.4 //版權所有,盜版必究。 //Copyright(C) 正點原子 2009-2019 //All rights reserved //******************************************************************************** //THUMB指令不支持匯編內聯 //采用如下方法實現執行匯編指令WFI void WFI_SET(void) {__ASM volatile("wfi"); } //關閉所有中斷 void INTX_DISABLE(void) { __ASM volatile("cpsid i"); } //開啟所有中斷 void INTX_ENABLE(void) {__ASM volatile("cpsie i"); } //設置棧頂地址 //addr:棧頂地址 __asm void MSR_MSP(u32 addr) {MSR MSP, r0 //set Main Stack valueBX r14 }

sys.h 這個就重要了

#ifndef __SYS_H #define __SYS_H #include "stm32f10x.h" // //本程序只供學習使用,未經作者許可,不得用于其它任何用途 //ALIENTEK STM32開發板 //正點原子@ALIENTEK //技術論壇:www.openedv.com //修改日期:2012/8/18 //版本:V1.7 //版權所有,盜版必究。 //Copyright(C) 廣州市星翼電子科技有限公司 2009-2019 //All rights reserved // //0,不支持ucos //1,支持ucos #define SYSTEM_SUPPORT_OS 0 //定義系統文件夾是否支持UCOS//位帶操作,實現51類似的GPIO控制功能 //具體實現思想,參考<<CM3權威指南>>第五章(87頁~92頁). //IO口操作宏定義 #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))   //addr 地址 bit 比特 #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)) //IO口地址映射 #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C #define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C #define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C #define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C #define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C #define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C #define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808 #define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08 #define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008 #define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408 #define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808 #define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08 #define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08 //IO口操作,只對單一的IO口! //確保n的值小于16! #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //輸出 #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //輸入 #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //輸出 #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //輸入 #define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //輸出 #define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //輸入 #define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //輸出 #define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //輸入 #define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //輸出 #define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //輸入#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //輸出 #define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //輸入#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //輸出 #define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //輸入//以下為匯編函數 void WFI_SET(void); //執行WFI指令 void INTX_DISABLE(void);//關閉所有中斷 void INTX_ENABLE(void); //開啟所有中斷 void MSR_MSP(u32 addr); //設置堆棧地址#endif

即使是位操作,也少不了IO口調用時鐘和初始化,說白了,就是講庫函數里面的GPIO_SetBits、GPIO_ResetBits分別用0、1替換

下面獻上代碼:
main.c

#include "stm32f10x.h" #include "led.h" #include "delay.h" //沒有加#include"sys.h"是因為delay.h里面頭文件已經包含了/************************************************ALIENTEK 戰艦STM32F103開發板實驗0工程模板注意,這是手冊中的新建工程章節使用的main文件 技術支持:www.openedv.com淘寶店鋪:http://eboard.taobao.com 關注微信公眾平臺微信號:"正點原子",免費獲取STM32資料。廣州市星翼電子科技有限公司 作者:正點原子 @ALIENTEK ************************************************/int main(void){ delay_init();LED_Init();while(1){PBout(5)=1;PEout(5)=1;delay_ms(500);PBout(5)=0;PEout(5)=0;delay_ms(500);}}

這是在led.c里面的初始化

#include "led.h"// //本程序只供學習使用,未經作者許可,不得用于其它任何用途 //ALIENTEK戰艦STM32開發板 //LED驅動代碼 //正點原子@ALIENTEK //技術論壇:www.openedv.com //修改日期:2012/9/2 //版本:V1.0 //版權所有,盜版必究。 //Copyright(C) 廣州市星翼電子科技有限公司 2009-2019 //All rights reserved // //初始化PB5和PE5為輸出口.并使能這兩個口的時鐘 //LED IO初始化 void LED_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE端口時鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHzGPIO_Init(GPIOB, &GPIO_InitStructure); //根據設定參數初始化GPIOB.5GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 輸出高GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 端口配置, 推挽輸出GPIO_Init(GPIOE, &GPIO_InitStructure); //推挽輸出 ,IO口速度為50MHzGPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 輸出高 }

總結

以上是生活随笔為你收集整理的01、【正点原子】sys.c、sys.h位带操作的简单应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。