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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2410|回復: 10
收起左側

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

[復制鏈接]
ID:302293 發表于 2023-9-6 11:45 | 顯示全部樓層 |閱讀模式
比如普冉F003的位帶,根據寄存器手冊來編寫,應該怎么寫,有思路的大俠指點一下
回復

使用道具 舉報

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再來發言。
回復

使用道具 舉報

ID:434018 發表于 2023-9-10 10:53 | 顯示全部樓層
提醒:并非所有的STM32都支援bitband,如M0不支援.
回復

使用道具 舉報

ID:1093023 發表于 2023-9-10 20:54 | 顯示全部樓層
這些指令你看懂沒?你沒看懂,建議你先去學習后再吐槽
回復

使用道具 舉報

ID:1093023 發表于 2023-9-10 20:59 | 顯示全部樓層
frank_tw 發表于 2023-9-10 10:53
提醒:并非所有的STM32都支援bitband,如M0不支援.

還是你懂!
回復

使用道具 舉報

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
回復

使用道具 舉報

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

使用道具 舉報

ID:1092275 發表于 2023-9-13 08:03 | 顯示全部樓層
位帶操作需要硬件支持
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本福利视频 | 国产久| 成人中文字幕在线观看 | 国产精品国产成人国产三级 | 欧美黑粗大| 中文字幕免费在线看线人动作大片 | 免费一级大片 | 精品视频在线免费 | 精品一区二区三区四区五区 | 欧美综合久久 | 91亚洲国产成人久久精品麻豆 | 成人玩具h视频 | 亚洲第一色 | 久久久久久久久久国产精品 | www99热 | 国产精品日韩精品 | 男男成人高潮片免费网站 | 国产高清免费视频 | 爱爱免费网站 | 欧美性久久 | 97超碰资源总站 | 亚洲综合欧美 | 欧美大片黄 | 成人黄色小视频 | 国产精品一区二区视频 | 在线观看黄色小视频 | 欧美性猛交99久久久久99按摩 | 日韩专区在线 | 国产综合亚洲精品一区二 | 国产小视频在线观看 | 国产美女91呻吟求 | 户外少妇对白啪啪野战 | 中文字幕在线观看日本 | 大色av| 69成人网 | 久久精品国产一区 | 欧美性生交xxxxx久久久 | 97caoporn| ass亚洲尤物裸体pics | 日本免费视频 | 国产黄在线 |