写给初学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)
|