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

標題: stm32單片機位帶操作怎么用寄存器手冊來編寫? [打印本頁]

作者: sr861126    時間: 2023-9-6 11:45
標題: stm32單片機位帶操作怎么用寄存器手冊來編寫?
比如普冉F003的位帶,根據寄存器手冊來編寫,應該怎么寫,有思路的大俠指點一下

作者: Hephaestus    時間: 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)  //輸入  
復制代碼

作者: zhangqi_12345    時間: 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

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

你先去查查什么叫位帶bitband再來發言。
作者: frank_tw    時間: 2023-9-10 10:53
提醒:并非所有的STM32都支援bitband,如M0不支援.
作者: zhangqi_12345    時間: 2023-9-10 20:54
這些指令你看懂沒?你沒看懂,建議你先去學習后再吐槽
作者: zhangqi_12345    時間: 2023-9-10 20:59
frank_tw 發表于 2023-9-10 10:53
提醒:并非所有的STM32都支援bitband,如M0不支援.

還是你懂!
作者: heitudi    時間: 2023-9-11 09:36
這個還是F4系列的,F1的還不一樣。
如下:
#define GPIOA_ODR_Addr    (GPIOK_BASE+16)  // F103

#define GPIOA_IDR_Addr    (GPIOA_BASE+12)  //F103
作者: sttt300    時間: 2023-9-11 10:59
位帶操作需要硬件支持,其目的是實現類似51那樣的sbit xx P0^1這樣的單獨操作某IO口
用宏定義函數也可以同樣實現,不用一定要位帶操作的

作者: sj820224    時間: 2023-9-13 08:03
位帶操作需要硬件支持




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产目拍亚洲精品99久久精品 | 国产一区二区中文字幕 | 综合色在线 | 久久久成人免费一区二区 | 亚洲精品免费视频 | 一区二区精品 | 国产在线1区 | 中文字幕第一页在线 | 久久99国产精一区二区三区 | 成人妇女免费播放久久久 | 亚洲性网| 欧美激情va永久在线播放 | 午夜小影院 | 国产精品视频在线观看 | 美人の美乳で授乳プレイ | 精品毛片视频 | 国产精品国产三级国产a | 欧美一级视频在线观看 | 91精品中文字幕一区二区三区 | 91视频88av| 欧美精品在线观看 | 亚洲综合色网 | 久久久久国产精品 | 琪琪午夜伦伦电影福利片 | 日韩快播电影网 | 一二区成人影院电影网 | 国产亚洲精品精品国产亚洲综合 | 成人在线精品视频 | 给我免费的视频在线观看 | 午夜免费观看 | 色爱av| 伊人狠狠干 | 免费成年网站 | 免费网站国产 | 成人在线免费观看视频 | 国产精品自拍av | 亚洲国产精品人人爽夜夜爽 | 国产成人在线免费 | 日韩av成人在线 | wwww.8888久久爱站网 | 免费国产视频在线观看 |