久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2352|回復: 10
打印 上一主題 下一主題
收起左側

stm32單片機位帶操作怎么用寄存器手冊來編寫?

[復制鏈接]
跳轉到指定樓層
樓主
ID:302293 發表于 2023-9-6 11:45 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
比如普冉F003的位帶,根據寄存器手冊來編寫,應該怎么寫,有思路的大俠指點一下
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:883242 發表于 2023-9-6 16:50 | 只看該作者
  1. // 把“位帶地址+位序號”轉換成別名地址的宏
  2. #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x02000000+((addr & 0x000FFFFF)<<5)+(bitnum<<2))

  3. // 把一個地址轉換成一個指針
  4. #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))

  5. // 把位帶別名區地址轉換成指針
  6. #define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))


  7. // GPIO ODR 和 IDR 寄存器地址映射
  8. #define GPIOA_ODR_Addr    (GPIOA_BASE+20)
  9. #define GPIOB_ODR_Addr    (GPIOB_BASE+20)   
  10. #define GPIOC_ODR_Addr    (GPIOC_BASE+20)  
  11. #define GPIOD_ODR_Addr    (GPIOD_BASE+20)
  12. #define GPIOE_ODR_Addr    (GPIOE_BASE+20)
  13. #define GPIOF_ODR_Addr    (GPIOF_BASE+20)      
  14. #define GPIOG_ODR_Addr    (GPIOG_BASE+20)
  15. #define GPIOH_ODR_Addr    (GPIOH_BASE+20)      
  16. #define GPIOI_ODR_Addr    (GPIOI_BASE+20)
  17. #define GPIOJ_ODR_Addr    (GPIOJ_BASE+20)      
  18. #define GPIOK_ODR_Addr    (GPIOK_BASE+20)

  19. #define GPIOA_IDR_Addr    (GPIOA_BASE+16)  
  20. #define GPIOB_IDR_Addr    (GPIOB_BASE+16)  
  21. #define GPIOC_IDR_Addr    (GPIOC_BASE+16)   
  22. #define GPIOD_IDR_Addr    (GPIOD_BASE+16)  
  23. #define GPIOE_IDR_Addr    (GPIOE_BASE+16)   
  24. #define GPIOF_IDR_Addr    (GPIOF_BASE+16)   
  25. #define GPIOG_IDR_Addr    (GPIOG_BASE+16)  
  26. #define GPIOH_IDR_Addr    (GPIOH_BASE+16)
  27. #define GPIOI_IDR_Addr    (GPIOI_BASE+16)
  28. #define GPIOJ_IDR_Addr    (GPIOJ_BASE+16)
  29. #define GPIOK_IDR_Addr    (GPIOK_BASE+16)


  30. // 單獨操作 GPIO的某一個IO口,n(0,1,2...16),n表示具體是哪一個IO口
  31. #define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //輸出   
  32. #define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //輸入   

  33. #define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //輸出   
  34. #define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //輸入   

  35. #define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //輸出   
  36. #define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //輸入   

  37. #define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //輸出   
  38. #define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //輸入   

  39. #define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //輸出   
  40. #define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //輸入  

  41. #define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //輸出   
  42. #define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //輸入  

  43. #define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //輸出   
  44. #define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //輸入  

  45. #define PHout(n)   BIT_ADDR(GPIOH_ODR_Addr,n)  //輸出   
  46. #define PHin(n)    BIT_ADDR(GPIOH_IDR_Addr,n)  //輸入  

  47. #define PIout(n)   BIT_ADDR(GPIOI_ODR_Addr,n)  //輸出   
  48. #define PIin(n)    BIT_ADDR(GPIOI_IDR_Addr,n)  //輸入

  49. #define PJout(n)   BIT_ADDR(GPIOJ_ODR_Addr,n)  //輸出   
  50. #define PJin(n)    BIT_ADDR(GPIOJ_IDR_Addr,n)  //輸入  

  51. #define PKout(n)   BIT_ADDR(GPIOK_ODR_Addr,n)  //輸出   
  52. #define PKin(n)    BIT_ADDR(GPIOK_IDR_Addr,n)  //輸入  
復制代碼
回復

使用道具 舉報

板凳
ID:1093023 發表于 2023-9-9 23:27 | 只看該作者
以PD7為例說明,在H文件中使用宏定義+庫函數
1、對于輸出狀態來說:
#define  PD7_Outstatus  GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_7)  //PD7的輸出狀態
2、對于輸入狀態來說
#define  PD7_Instatus  GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_7)  //PD7的輸入狀態

在C文件中:
1、對PD7進行初始化,開啟外設時鐘,設定是輸入還是輸出模式等。注意,不能設定既是輸入又是輸出!
2、判斷PD7輸入的狀態
if(PD7_Instatus==1){.....}
if(PD7_Instatus==0){.....}
3、判斷PD7輸出的狀態
if(PD7_Outstatus==1){.....}
if(PD7_Outstatus==0){.....}
3、對于輸出置0或置1來說,可以在H文件用宏定義,也可以在C文件中創建函數
宏定義:
#define  PD7_Out=1  GPIO_SetBits(GPIOD, GPIO_Pin_7)  //PD7輸出1
#define  PD7_Out=0  GPIO_ResetBits(GPIOD, GPIO_Pin_7)  //PD7輸出0
函數:
void PD7_Out(u8 Cmd)
{
       if(Cmd==0)  GPIO_ResetBits(GPIOD, GPIO_Pin_7)  //PD7輸出0
else if(Cmd==1)  GPIO_SetBits(GPIOD, GPIO_Pin_7)  //PD7輸出1
}
函數調用:
PD7_Out(1); //輸出1
PD7_Out(0); //輸出0
回復

使用道具 舉報

地板
ID:883242 發表于 2023-9-10 03:30 | 只看該作者
zhangqi_12345 發表于 2023-9-9 23:27
以PD7為例說明,在H文件中使用宏定義+庫函數
1、對于輸出狀態來說:
#define  PD7_Outstatus  GPIO_ReadO ...

你先去查查什么叫位帶bitband再來發言。
回復

使用道具 舉報

5#
ID:434018 發表于 2023-9-10 10:53 | 只看該作者
提醒:并非所有的STM32都支援bitband,如M0不支援.
回復

使用道具 舉報

6#
ID:1093023 發表于 2023-9-10 20:54 | 只看該作者
這些指令你看懂沒?你沒看懂,建議你先去學習后再吐槽
回復

使用道具 舉報

7#
ID:1093023 發表于 2023-9-10 20:59 | 只看該作者
frank_tw 發表于 2023-9-10 10:53
提醒:并非所有的STM32都支援bitband,如M0不支援.

還是你懂!
回復

使用道具 舉報

8#
ID:747496 發表于 2023-9-11 09:36 | 只看該作者
這個還是F4系列的,F1的還不一樣。
如下:
#define GPIOA_ODR_Addr    (GPIOK_BASE+16)  // F103

#define GPIOA_IDR_Addr    (GPIOA_BASE+12)  //F103
回復

使用道具 舉報

9#
ID:647261 發表于 2023-9-11 10:59 | 只看該作者
位帶操作需要硬件支持,其目的是實現類似51那樣的sbit xx P0^1這樣的單獨操作某IO口
用宏定義函數也可以同樣實現,不用一定要位帶操作的
回復

使用道具 舉報

10#
ID:1092275 發表于 2023-9-13 08:03 | 只看該作者
位帶操作需要硬件支持
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美极品少妇xxxxⅹ免费视频 | 久久久久久亚洲精品 | 国产精品一区二区三区久久久 | 色播久久 | www.欧美视频 | 久久y| 成人av影院 | 69热视频在线观看 | 欧美视频一级 | 欧美性网 | 在线中文字幕日韩 | 国产精品久久久久无码av | 久久最新 | 欧美在线a| 黄色中文字幕 | 中文字幕四虎 | 亚洲欧美激情精品一区二区 | 一区二区三区高清 | 日韩欧美不卡 | 玖玖精品视频 | 天天操夜夜拍 | 日本电影免费完整观看 | 午夜免费福利电影 | 国产精品一区二 | 精品日本久久久久久久久久 | 色婷婷精品久久二区二区蜜臂av | 欧美国产视频一区二区 | 人人干免费 | 国产精品免费在线 | 一区二区三区精品视频 | 国产免国产免费 | 久久国产亚洲 | 91爱啪啪 | 丝袜美腿一区 | 欧美在线视频免费 | 久久久久成人精品免费播放动漫 | 日韩无| 免费一区| 亚洲国产一区二区三区在线观看 | www.中文字幕 | 国产成人精品一区二区三区在线 |