欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
聽說你害怕學stm32?專治stm32的辦法來了,stm32仿C51操作方式操作IO口(支持P...
[打印本頁]
作者:
Angle145
時間:
2018-6-18 15:26
標題:
聽說你害怕學stm32?專治stm32的辦法來了,stm32仿C51操作方式操作IO口(支持P...
寫給初學stm32的小白,如果你不想深入學習stm32,又想用stm32的高性能優點來替換C51,那么這里提供了stm32變C51的一個捷徑,有的人可能會有疑問,這會不會降低stm32的速度,這你完全不用擔心,因為這個位綁定就是stm32自身提供的功能,屬于硬件級別的支持,所以放心大膽使用吧,對于老手,有的人可能會嘲笑stm32跑去仿C51這不是倒退么,其實不然,只要是方便快捷的東西我們就保持,不好的就丟棄而不是一味否認舊東西。從51轉32的同學大部分都是不適應的,以前都是直接操作寄存器,現在全是庫函數,一大串長長的庫函數名就讓人頭疼,這還是標準庫,現在ST公司又大力主推HAL庫,對于剛學完標準庫的同學又是一棒打擊,因為學習成本和學習時間太多了,有的人則說學什么庫函數,直接學寄存器操作,那么我想說,除非你在自娛自樂,因為想要深入學習,你不僅要學會寫代碼,而且要能讀懂別人的代碼,現在網上大多數stm32程序都是庫函編寫,所以你不想學也必須學,stm32f1由于出的早,大多數資料例程都是標準庫函數編寫的,而f7已經開始不支持標準庫了,f4處于中間的尷尬位置,雖有標準庫支持,但是st已經停止更新,主推hal庫。所以說想深入學習,hal庫是最好的選擇,優點是一次編寫,全st平臺適用,缺點是單片機效率降低。話不多說,對stm32f1來說,C51操作方式還是不可能過時的,因為它是51和32之間的橋梁。
stm32f1系位綁定實現的stm32仿C51方式配置和操作GPIO口,自從用上這個就回不去了。
部分代碼如下:
/*--------------------P口輸入輸出模式配置----------------------------------------
使用說明:
//舉例: PA0_OUT; //PA0配置成推挽輸出模式
PA0=1; //PA0輸出1
...
PA0=0; //PA0輸出0
當需要PA0改為輸入時,需要在使用前配置成輸入
PA0_IN; //PA0配置成上下拉輸入
PA0=1; //PA0配置成上拉輸入(PA0=0配置成下拉輸入)
if(PA0in==0) PA11=1; //讀取PA0的電平狀態
當PA0作為輸入使用完畢,PA0口又繼續上面的輸出工作,則重新再配置一次
PA0_OUT; //恢復PA0為輸出
PA0=0; //PA0輸出0
PA_OUT; //PA(16個IO口)配置成推挽輸出模式
PA=0xFF00; //高8位輸出1,低8位輸出0
PA_IN; //PA(16個IO口)配置成上下拉輸入
PA=0xFFFF; //PA(16個IO口)配置成上拉輸入
PB0_OUT; //PB0配置成推挽輸出模式
if(PAin==0xFFFF) PB0=1; //如果PA16個IO都等于1,則PB0置1
//注:讀取IO口時,先配置成輸入,IO名要加in作為讀取識別,這是唯一一點和C51不同的地方
_OUT --推挽輸出
_OUT_AF --復用功能輸出
_IN --上下拉輸入 輸入前,P口置1,則是上拉輸入,反之是下拉輸入
_IN_AN --模擬輸入
PA0_OUT; //配置單個IO口為輸出模式
PA0_OUT_AF; //配置單個IO口為復用功能輸出模式
PA0_IN; //配置單個IO口為輸入模式
PA0_IN_AN; //配置單個IO口為模擬輸入模式
PA_OUT; //配置整個PA口(16個IO)為輸出模式
PA_IN; //配置整個PA口(16個IO)為輸入模式
注:PB3,PB4(JNTRST),PA13(SWD),PA14(SWC),PA15 為JTAG/SWD仿真器的調試接口(上電默認為JTAG功能,不能用于普通IO口功能)
關閉對應的的調試接口功能才能作為普通IO口使用,調試接口調置命令如下:
SWJ_ON ---SW+JTAG功能都打開(上電默認狀態), PB3,PB4,PA13,PA14,PA15不能用作普通IO口功能
SWJ_NOJNTRST ---SW+JTAG功能都打開,但是不用JTAG復位引腳(PB4),PB4用作普通IO口功能
SWON_JTAGOFF ---SW功能打開,JTAG功能關閉, PB3,PB4,PA15用作普通IO口功能
SWJ_OFF ---SW+JTAG功能都關閉,但能用ST-LINK, PB3,PB4,PA13,PA14,PA15用作普通IO口功能
----------------------------------------------------------------------------------*/
#ifndef _C51MODE_H
#define _C51MODE_H
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR( BITBAND(addr, bitnum) )
#define GPIOA_ODR_Addr (GPIOA_BASE+0x0C) //0x4001080C
#define GPIOB_ODR_Addr (GPIOB_BASE+0x0C) //0x40010C0C
#define GPIOC_ODR_Addr (GPIOC_BASE+0x0C) //0x4001100C
#define GPIOD_ODR_Addr (GPIOD_BASE+0x0C) //0x4001140C
#define GPIOE_ODR_Addr (GPIOE_BASE+0x0C) //0x4001180C
#define GPIOF_ODR_Addr (GPIOF_BASE+0x0C) //0x40011808
#define GPIOG_ODR_Addr (GPIOG_BASE+0x0C) //0x40011808
#define GPIOA_IDR_Addr (GPIOA_BASE+0x08) //0x40010808
#define GPIOB_IDR_Addr (GPIOB_BASE+0x08) //0x40010C08
#define GPIOC_IDR_Addr (GPIOC_BASE+0x08) //0x40011008
#define GPIOD_IDR_Addr (GPIOD_BASE+0x08) //0x40011408
#define GPIOE_IDR_Addr (GPIOE_BASE+0x08) //0x40011808
#define GPIOF_IDR_Addr (GPIOF_BASE+0x08) //0x40011808
#define GPIOG_IDR_Addr (GPIOG_BASE+0x08) //0x40011808
//-----------------------------------------------------
/*---------------------------------PA口引腳功能配置------------------------------------------*/
#define PA0_OUT RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFFFFF0; GPIOA->CRL|=0x00000003
#define PA1_OUT RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFFFF0F; GPIOA->CRL|=0x00000030
#define PA2_OUT RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFFF0FF; GPIOA->CRL|=0x00000300
#define PA3_OUT RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFF0FFF; GPIOA->CRL|=0x00003000
#define PA4_OUT RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFF0FFFF; GPIOA->CRL|=0x00030000
#define PA5_OUT RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFF0FFFFF; GPIOA->CRL|=0x00300000
#define PA6_OUT RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xF0FFFFFF; GPIOA->CRL|=0x03000000
#define PA7_OUT RCC->APB2ENR|=1<<2;GPIOA->CRL&=0x0FFFFFFF; GPIOA->CRL|=0x30000000
#define PA8_OUT RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFFFFF0; GPIOA->CRH|=0x00000003
#define PA9_OUT RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFFFF0F; GPIOA->CRH|=0x00000030
#define PA10_OUT RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFFF0FF; GPIOA->CRH|=0x00000300
#define PA11_OUT RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFF0FFF; GPIOA->CRH|=0x00003000
#define PA12_OUT RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFF0FFFF; GPIOA->CRH|=0x00030000
#define PA13_OUT RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFF0FFFFF; GPIOA->CRH|=0x00300000
#define PA14_OUT RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xF0FFFFFF; GPIOA->CRH|=0x03000000
#define PA15_OUT RCC->APB2ENR|=1<<2;GPIOA->CRH&=0x0FFFFFFF; GPIOA->CRH|=0x30000000
#define PA0_IN RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFFFFF0; GPIOA->CRL|=0x00000008
#define PA1_IN RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFFFF0F; GPIOA->CRL|=0x00000080
#define PA2_IN RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFFF0FF; GPIOA->CRL|=0x00000800
#define PA3_IN RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFF0FFF; GPIOA->CRL|=0x00008000
#define PA4_IN RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFF0FFFF; GPIOA->CRL|=0x00080000
#define PA5_IN RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFF0FFFFF; GPIOA->CRL|=0x00800000
#define PA6_IN RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xF0FFFFFF; GPIOA->CRL|=0x08000000
#define PA7_IN RCC->APB2ENR|=1<<2;GPIOA->CRL&=0x0FFFFFFF; GPIOA->CRL|=0x80000000
#define PA8_IN RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFFFFF0; GPIOA->CRH|=0x00000008
#define PA9_IN RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFFFF0F; GPIOA->CRH|=0x00000080
#define PA10_IN RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFFF0FF; GPIOA->CRH|=0x00000800
#define PA11_IN RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFF0FFF; GPIOA->CRH|=0x00008000
#define PA12_IN RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFF0FFFF; GPIOA->CRH|=0x00080000
#define PA13_IN RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFF0FFFFF; GPIOA->CRH|=0x00800000
#define PA14_IN RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xF0FFFFFF; GPIOA->CRH|=0x08000000
#define PA15_IN RCC->APB2ENR|=1<<2;GPIOA->CRH&=0x0FFFFFFF; GPIOA->CRH|=0x80000000
#define PA0 BIT_ADDR(GPIOA_ODR_Addr, 0) //輸出
#define PA1 BIT_ADDR(GPIOA_ODR_Addr, 1) //輸出
#define PA2 BIT_ADDR(GPIOA_ODR_Addr, 2) //輸出
#define PA3 BIT_ADDR(GPIOA_ODR_Addr, 3) //輸出
#define PA4 BIT_ADDR(GPIOA_ODR_Addr, 4) //輸出
#define PA5 BIT_ADDR(GPIOA_ODR_Addr, 5) //輸出
#define PA6 BIT_ADDR(GPIOA_ODR_Addr, 6) //輸出
#define PA7 BIT_ADDR(GPIOA_ODR_Addr, 7) //輸出
#define PA8 BIT_ADDR(GPIOA_ODR_Addr, 8) //輸出
#define PA9 BIT_ADDR(GPIOA_ODR_Addr, 9) //輸出
#define PA10 BIT_ADDR(GPIOA_ODR_Addr, 10) //輸出
#define PA11 BIT_ADDR(GPIOA_ODR_Addr, 11) //輸出
#define PA12 BIT_ADDR(GPIOA_ODR_Addr, 12) //輸出
#define PA13 BIT_ADDR(GPIOA_ODR_Addr, 13) //輸出
#define PA14 BIT_ADDR(GPIOA_ODR_Addr, 14) //輸出
#define PA15 BIT_ADDR(GPIOA_ODR_Addr, 15) //輸出
#define PA0in BIT_ADDR(GPIOA_IDR_Addr, 0) //輸入
#define PA1in BIT_ADDR(GPIOA_IDR_Addr, 1) //輸入
#define PA2in BIT_ADDR(GPIOA_IDR_Addr, 2) //輸入
#define PA3in BIT_ADDR(GPIOA_IDR_Addr, 3) //輸入
#define PA4in BIT_ADDR(GPIOA_IDR_Addr, 4) //輸入
#define PA5in BIT_ADDR(GPIOA_IDR_Addr, 5) //輸入
#define PA6in BIT_ADDR(GPIOA_IDR_Addr, 6) //輸入
#define PA7in BIT_ADDR(GPIOA_IDR_Addr, 7) //輸入
#define PA8in BIT_ADDR(GPIOA_IDR_Addr, 8) //輸入
#define PA9in BIT_ADDR(GPIOA_IDR_Addr, 9) //輸入
#define PA10in BIT_ADDR(GPIOA_IDR_Addr, 10) //輸入
#define PA11in BIT_ADDR(GPIOA_IDR_Addr, 11) //輸入
#define PA12in BIT_ADDR(GPIOA_IDR_Addr, 12) //輸入
#define PA13in BIT_ADDR(GPIOA_IDR_Addr, 13) //輸入
#define PA14in BIT_ADDR(GPIOA_IDR_Addr, 14) //輸入
#define PA15in BIT_ADDR(GPIOA_IDR_Addr, 15) //輸入
#define PA MEM_ADDR(GPIOA_ODR_Addr) //PA 16個IO口同時動作
//PB-PG部分和SW/JTAG引腳功能設置請參考具體代碼
//有不懂的地方歡迎留言
復制代碼
全部資料51hei下載地址:
C51Mode.zip
(6.45 KB, 下載次數: 72)
2018-6-18 16:02 上傳
點擊文件名下載附件
stm32仿C51IO口操作方式
下載積分: 黑幣 -5
作者:
admin
時間:
2018-6-22 17:47
好資料,51黑有你更精彩!!!
作者:
nsj21n
時間:
2018-6-23 08:40
這個確實是很不錯的東西,值得推薦
作者:
wuxishun
時間:
2018-6-25 06:21
非常好,可以參考
作者:
chenjialin12
時間:
2019-8-3 22:09
感謝大佬
作者:
sec
時間:
2019-9-29 16:51
那么工程怎么建,和51一樣?還是也要搭建stm32的庫
作者:
waerdeng
時間:
2019-9-29 20:22
非常好,非常適合我等新手,可以參考。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1