OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 221222|回复: 972

独家吐血原创奉献 !!! - - - - - - 仅需一个头文件,就可以彻底甩开库函数进行STM32高效编程

  [复制链接]

31

主题

1951

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4416
金钱
4416
注册时间
2018-5-11
在线时间
922 小时
发表于 2019-5-31 16:36:30 | 显示全部楼层 |阅读模式
本帖最后由 warship 于 2019-6-3 16:42 编辑

初入原子的STM32开发板,学习MCU编程的同学,
总是为寄存器版本或库函数版本而难以取舍,
其实是各有千秋的。

寄存器版本比较繁琐,学习起来难度要大一些,但掌握之后可以随心所欲地控制;
库函数版本则入手容易一起,但往往最后一知半解,遇到问题后不知如何下手调试。

我当初也是从库函数入手的,但最后还是觉得直接控制寄存器比较爽。
对于开发MCU的攻城狮来说,搞通硬件是必须的功课,对于寄存器的了解是回避不了的,
即使STM32全部用库,许多外部硬件如NRF24L01等等,也大多是寄存器控制的,从某种程度上来说,了解和使用外设的寄存器属于硬件基本功之一。
话说STM32的库虽然入手容易,其实编程时,也是需要去熟悉库中的各种函数,翻看库函数的定义以及各种参数设置的,
功夫一点儿也不少费,何况库还有各种版本,现在又开始推广HAL库,标准库即将被放弃,
对于许多习惯了标准库的老手来说,转库也是一件比较头大的事儿。
寄存器编程虽然说无须依赖库,但编写代码时查核寄存器名、控制位的作用、具体BIT位置等确实让人烦,
编写出的代码也比较难懂,估计一两个星期不看,自己编写的代码都要再去翻看手册才能看懂。

有没有彻底不依赖库函数,而代码又相对易记易懂,比直接寄存器编程还要高效的编程方法呢?
我可以负责任地告诉你,有!

一年多来(从这个帖子http://www.openedv.com/forum.php?mod=viewthread&tid=274196开始),本人对此进行了尝试,效果还不错。
方法是:大量采用STM32所特有的高效的单BIT位段操作模式,同时辅以多BIT读写模式,
通过宏定义进行简单封装以提高代码的可读易记性。

重要的是:只须一个头文件就可以实现。头文件不占用任何资源,对你原有的寄存器编程或库函数编程没有任何
影响,达到全兼容(即你完全可以在一个工程中部分采用本人宏定义中的方法,部分仍采用寄存器编程或库函数编程)。

这个头文件共约2300多行,是本人长时间吐血原创、修改、测试,已在多个项目中试用成功,效果很好。
文件中包含大量的注释,包括寄存器各BIT位的定义、用法,基本无须再翻看器件手册了。
本着开源精神,不敢独享,现分享给大家。
顺便也想借着更多人的应用,找点儿BUG,使之更加完善。
请同好者多提宝贵意见(我会酌情采纳更新),不喜欢也请勿喷。

//////////////////////////////////////////////////////////////////////////////////
下面给出头文件,使用起来非常非常简单只须在你的工程中包含这个头文件
解压下面的包,得到一个MyBITBAND.h头文件,复制到你的工程目录中,然后#include "MyBITBAND.h"
就可以尽情地自由使用本文所述的编程方法,你可以把你手头上的程序改几句试一下,不甜不要钱,哈哈。
如果有要求具体程序范例的话,我会在后续给出(后计: 范例工程模板也已提供在下面)。
另外,需要说明一下的是,文件是以STM32 F1XX为目标的,其它型号楼主还没有测试过。
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//测试平台:ALIENTEK战舰STM32开发板
//引用请注明出处:http://www.openedv.com/forum.php?mod=viewthread&tid=294788,有问题可在本帖中提出讨论,谢谢。
//敬请关注我的开源页https://github.com/ShuifaHe/STM32/tree/BITBAND如果觉得对您有用的话,请按 “星” 号点一下赞
//修改日期:2019/05/28
//Made by warship
回复后可获取解压密码,谢谢支持。解压密码:warship0601







MyBITBAND.zip

38.84 KB, 下载次数: 1443

20190531更新

模板工程范例EXTI_TEST.zip

170.31 KB, 下载次数: 2098

20190531

我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

400

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1746
金钱
1746
注册时间
2015-6-11
在线时间
308 小时
发表于 2019-6-4 08:47:43 | 显示全部楼层
本帖最后由 zc123 于 2019-6-4 09:24 编辑

虽然我也讨厌HAL库的雍肿,效率低,但你这是实现stm32f10x.h这个头文件的在封装而已,HAL库实现的是接口API和软件逻辑,这才是主要功能,类似USART,RCC,ETH模块,它是实现初始化,读写接口的,中断响应,状态读取/清除这整套API应用的,你的封装思路是没有这部分逻辑的,其实你的思路和寄存器操作一样的,库和寄存器的使用这方面争论已经持续很久,我是认为没比较的理由,因为设计的目的都不一样,库是为了脱离硬件的封装,寄存器则为了更高的效率,没有任何可比性。
你的优势就是和直接的寄存器操作的比较,大部分情况比直接包含stm32f10x.h更直观。但是实际上按照你的API,脱离寄存器文档是不可能,因为涉及位的操作,特别是多位的操作,不去查文档,单靠命名并不能完全解决问题,我的建议是需要先理清楚这个是否是伪需求,不然花了大量时间并不值得,而且这里面大部分是替换的工作量,核心的就位操作或者位域的知识。
回复 支持 19 反对 0

使用道具 举报

31

主题

1951

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4416
金钱
4416
注册时间
2018-5-11
在线时间
922 小时
 楼主| 发表于 2019-5-31 16:37:49 | 显示全部楼层
本帖最后由 warship 于 2019-6-3 12:36 编辑

总体说明

    利用本文件,可以比较方便、高效精准地以位段方式访问寄存器,结合多BIT访问、寄存器直接访问等方式,能够最终完全抛开库函数。

     一、以外设原有名称为基础,在外设名称前面加前缀b, 与库函数区分的同时,指示这用作bitband操作。

     二、进一步强化助记,将部分具体寄存器名称弱化,比如某外设有多个控制寄存器CR1、CR2、CR3,则统一省略为CR,不必记忆是第几个CR。
尝试对于常用的外设如RCC,进一步根据功能进行了改造,比如将所有使能时钟控制归纳成bRCC_ENABLE_XXX(其中XXX为外设名),
便于记忆,不用再考虑某外设挂在哪条具体总线上等细节,相当于进行了一个小小的二次封装。

     三、BIT位的名称尽量采用原名称,以便对照查阅芯片数据手册。寄存器地址偏移量按一般用户手册以十六进制填充。

     四、考虑到位操作的优势在精准高效地对位进行操作,这也是编写此文件的出发点。但考虑到两位以上的组合操作也无法避免,
并且直接访问寄存器某几位也比较麻烦, 这里采用带参的宏定义制定了统一的访问格式.

     五、对于一般没有位定义、通常整字访问的寄存器,仍可沿用传统的寄存器方式,这里也尝试定义了形如wBKP_DR1的宏指令方式对其进行访问,
即:wRTC_ALRH的效果等同于寄存器直接访问的RTC->ALRH;
而对于有多个同类外设时,对于外设某寄存器整体的读写,则引入类似如下的宏定义,
                        pTIM(bTIM3)->PSC        前缀“p”表示这是一个指向结构体的指针,等效于寄存器直接访问的TIM3->DR1
但引入带参宏定义的好处是,实现了与访问多组外设单BIT位或多BIT位时形参的统一,便于移植(详见6楼的描述)
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 2 反对 0

使用道具 举报

3

主题

1906

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4100
金钱
4100
注册时间
2018-8-14
在线时间
695 小时
发表于 2019-6-2 14:12:31 | 显示全部楼层
差不多所有寄存器的位, ST都做了宏的, 你再搞一套?
回复 支持 1 反对 0

使用道具 举报

31

主题

1951

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4416
金钱
4416
注册时间
2018-5-11
在线时间
922 小时
 楼主| 发表于 2019-5-31 16:41:26 | 显示全部楼层
本帖最后由 warship 于 2019-5-31 21:30 编辑

试举一例,采用本文方法编程(初始化TIM3为1ms中断一次)
void Timer3Init(void)
{
    bRCC_ENABLE_TIM3=1; //TIM3定时器时钟允许

    pTIM(bTIM3)->PSC=9; //预分频值10,即时钟频率为7200000,即时钟周期为1/7200k (s)           
    pTIM(bTIM3)->ARR=7199; //溢出时间为7200计数次,即溢出时间为7200次* 1/7200k (s)=1ms         
        
    SET_TIM_CR_CKD(bTIM3,0); //设置时钟分频因子=0(即:不分频)

    bTIM_CR_DIR(bTIM3)= 0;//向上计数
    bTIM_DIER_UIE(bTIM3)=1;//允许TIM3溢出(更新)中断

    //设置中断优先级(集中放在主程序的MX_NVIC_Init()函数中设置)

    bTIM_CR_CEN(bTIM3)=1;//打开定时器
               
}
***********************************************************

另外,仍以原子的试验5(外部中断试验)作为范例,
将完整的工程提供如下,欢迎下载测试(解压密码同顶楼)。
附件的sys.c文件中,对原子代码不合理的部分进行了修改(文件中有注释说明),
扩展了几个常用而好用的函数,
用位段操作编出来的代码更高效、程序的可读性更强,更容易理解上手。大家与原有的源码进行对比,就会有体会了。



EXTI_TEST.zip

170.31 KB, 下载次数: 369

20190531

我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 1 反对 0

使用道具 举报

31

主题

1951

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4416
金钱
4416
注册时间
2018-5-11
在线时间
922 小时
 楼主| 发表于 2019-5-31 16:38:46 | 显示全部楼层
本帖最后由 warship 于 2019-6-3 12:20 编辑

与寄存器编程模式的简单对比

(左侧为寄存器编程写法,右侧绿字体为采用本文方法的写法)
单比特的操作方法(实例中n=9,功能是使能或禁止ADC1的时钟):
RCC->APB2ENR|=1<<n;                  //置APB2ENR寄存器的第n比特为1,对应的位段操作为:bRCC_ENABLE_ADC1=1;       
RCC->APB2ENR&=~(1<<n);           //置APB2ENR寄存器的第n比特为0,对应的位段操作为:bRCC_ENABLE_ADC1=0;

多比特的操作方法(实例中n=18,功能是设置时钟PLL的倍频值为 a):
RCC->CFGR&=~(MASKb4<<n);           //先清除CFGR寄存器的从第n比特开始的连续4个比特
RCC->CFGR|=a<<n;                          //再把上述的比特位的值设置为a(注意a的值不可超出4比特的值域,即0-15)
                                                       //以上示例为连续4个比特,不同比特数须修改MASKb4为MASKbx
                                //以上两句对应一句搞定:SET_RCC_PLLMUL(a);     //并且自动限制了a的值域
                                       
可以对比体会使用本文操作方法的优势:
1、无须记忆所需操作的BIT位在原有寄存器中的位置(即上例中的n值,基本每次都要去查手册反复核实,这是
使用寄存器编程最头大的工作);
2、无须记忆所需要的功能在外设的具体哪个寄存器上。比如上例中需要使能ADC1的时钟,它在APB2ENR还是在
APB1ENR还是在AHBEN寄存器中(这也是使用寄存器编程比较烦琐的工作,极易出错并且难以排查);
3、无论是单BIT置1或清0,还是多BIT位设置为某个值,均编写直观,便于理解;
4、助记符意义明确,使得代码简单易懂,可在很大程度上省去注释的工作;如果有兴趣者在本文件的基础上再
进行二次封装,就能使得代码更加易记易用且可读性强
5、位段操作精准高效,可缩短目标代码长度,执行速度快;
6、便于移植,对于多个类似功能的外设,比如串口、定时器,当需要把TIM2换成TIM3时,几乎可以达到不用
修改代码就可以实现;
7、兼容性强,可以与寄存器编程、标准库、HAL库混合编程,并且只须在工程中包含这一个头文件就可以了。
稍有寄存器编程的基础,熟悉一下本文件的内容后完全可以抛开标准库、HAL库自由发挥了。




我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 1 反对 0

使用道具 举报

31

主题

1951

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4416
金钱
4416
注册时间
2018-5-11
在线时间
922 小时
 楼主| 发表于 2019-5-31 16:38:24 | 显示全部楼层
本帖最后由 warship 于 2019-6-3 12:34 编辑

编程使用的统一格式
单BIT位访问方式
                bRCC_ENABLE_RTC=1或0;                                                                                    //唯一外设
                bTIM_CR_DIR(bTIM2)=1或0;                                                                             //多组外设
                bGPIO_BRR(bGPIOA,n)=1或0;                                                                              //多组外设多个端口
                也可读,或者用于逻辑判断,EX:if(!bRCC_ENABLE_RTC)

多BIT位访问方式
                SET_RCC_PLLMUL(a);(设置PLL倍频值为a)                    写                                      //唯一外设
                val=GET_RCC_PLLMUL;(获取PLL倍频设置值)                读

                SET_SPI_CR_BR(bSPI2,a);        (设置bSPI2接口的速率值为a)        写                        //多组外设
                val=GET_SPI_CR_BR(bSPI1);(获取bSPI1x接口的速率值)               读

寄存器整体访问方式
              一般仍沿用寄存器直接访问方式不变:如BKP->DR1

我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 1 反对 0

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2017-2-22
在线时间
27 小时
发表于 2019-5-31 17:06:26 | 显示全部楼层
学习一下,谢谢楼主
回复 支持 1 反对 0

使用道具 举报

31

主题

1951

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4416
金钱
4416
注册时间
2018-5-11
在线时间
922 小时
 楼主| 发表于 2019-7-26 13:46:50 | 显示全部楼层
ndthome 发表于 2019-7-25 22:07
适用于哪个系列?

我是在STM32 F1XX 系列上进行的。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 1 反对 0

使用道具 举报

31

主题

1951

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4416
金钱
4416
注册时间
2018-5-11
在线时间
922 小时
 楼主| 发表于 2019-6-3 10:13:59 | 显示全部楼层
xmetoo 发表于 2019-6-3 08:49
建议将头文件中的命名规范详细点,挂在GitHub上,一起维护

谢谢支持,已经挂在GitHub上,希望多提宝贵意见,
欢迎共同维护,按星号点赞哦。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 1 反对 0

使用道具 举报

31

主题

1951

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4416
金钱
4416
注册时间
2018-5-11
在线时间
922 小时
 楼主| 发表于 2019-5-31 16:37:27 | 显示全部楼层
沙发(广告位招租)
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1951

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4416
金钱
4416
注册时间
2018-5-11
在线时间
922 小时
 楼主| 发表于 2019-5-31 16:39:18 | 显示全部楼层
本帖最后由 warship 于 2019-6-3 12:30 编辑

简化宏定义、便于代码移植   
     为减少宏定义的工作量,对于多个同类的外设,尤其是两个以上,如定时器、通信串口等,避免大量类似的宏定义
使用带参数的宏,形如bCR_CEN(bTIM1),其中bTIM1为基址宏

以b开头的基址宏定义(如bTIM1)的值,其原始本质就是一个u32的数值,所以
当有需要,想将它也作为一个可变参数时,可以定义形参的类型为u32
比如:想写一个设置任意SPI接口速率的函数
可编写如下函数:
        void SET_SPIx_SPEED(u32 MySPIx_Base, u8 SPI_SPEED)
        {
                SET_SPI_CR_BR(MySPIx_Base,SPI_SPEED);//设置SPI速率
        }
        调用时,入口参数MySPIx_Base分别使用bSPI1、bSPI2或bSPI3就可作用于不同的SPI口
   另外,在编程需要时,可用
((SPI_TypeDef *)MySPIx_Base)->DR; 取代SPIx->DR;
((SPI_TypeDef *)bSPI1)->DR;                          取代SPI1->DR;

在进一步地增加了宏定义 #define pSPI(bSPIx)                                ((SPI_TypeDef *)bSPIx)
之后,使得上两句可简写为:pSPI(bSPI1)->DR; //前缀“p”表示这是一个指向结构体的指针。
接近了寄存器编程的风格,也就是说,对于寄存器整体的访问,
除了仍可沿用原有的SPI1->DR外,也可以使用带参的宏定义方式:pSPI(bSPI1)->DR
使用者可以视情任意选择其一,但使用后者的好处是使得bSPIx成了与单BIT、多BIT访问时统一的参数,便于移植
比如:下列函数即向串口发送一个字符,如果移植时,只须替换bURT1为bURT2就可以从串口1改成串口2
void USART_SendData(u8 ch)
{
  pURT(bURT1)->DR  = ch ;
  while ( bURT_SR_TXE(bURT1) ==0 );
}
对比一下,如果第一句仍沿用传统的寄存器访问风格,则移植的时候就需要修改两种符号:
void USART_SendData(u8 ch)
{
  USART1->DR  = ch ;
  while ( bURT_SR_TXE(bURT1) ==0 );
}
后者比前者需要增加的工作量:还须将USART1改成USART2
而且,前者还可以很容易地写成向任意串口发送字符的通用函数:
void USART_SendData(u32 bURTx, u8 ch)
{
  pURT(bURTx)->DR  = ch ;
  while ( bURT_SR_TXE(bURTx) ==0 );
}





我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

2

主题

43

帖子

0

精华

高级会员

Rank: 4

积分
687
金钱
687
注册时间
2012-6-26
在线时间
258 小时
发表于 2019-5-31 17:10:01 | 显示全部楼层
看看。。。
回复 支持 反对

使用道具 举报

0

主题

47

帖子

0

精华

高级会员

Rank: 4

积分
723
金钱
723
注册时间
2019-3-1
在线时间
392 小时
发表于 2019-5-31 17:30:13 | 显示全部楼层
看看看
回复 支持 反对

使用道具 举报

37

主题

595

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1572
金钱
1572
注册时间
2017-7-17
在线时间
308 小时
发表于 2019-5-31 18:02:27 | 显示全部楼层
下来试试,谢谢楼主
回复 支持 反对

使用道具 举报

0

主题

286

帖子

0

精华

高级会员

Rank: 4

积分
949
金钱
949
注册时间
2018-4-21
在线时间
264 小时
发表于 2019-5-31 18:13:25 来自手机 | 显示全部楼层
支持一下,顺便谢谢分享
回复 支持 反对

使用道具 举报

1

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2019-1-17
在线时间
47 小时
发表于 2019-5-31 18:41:31 | 显示全部楼层
支持一下
回复 支持 反对

使用道具 举报

33

主题

481

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
5075
金钱
5075
注册时间
2013-10-4
在线时间
654 小时
发表于 2019-5-31 20:23:17 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

6

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
885
金钱
885
注册时间
2016-6-15
在线时间
362 小时
发表于 2019-5-31 21:21:11 | 显示全部楼层
看下               
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2018-12-26
在线时间
24 小时
发表于 2019-5-31 23:24:00 | 显示全部楼层
感谢感谢
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2019-5-31
在线时间
1 小时
发表于 2019-5-31 23:58:52 | 显示全部楼层
过来看看大神的教程
回复 支持 反对

使用道具 举报

5

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
255
金钱
255
注册时间
2016-11-5
在线时间
70 小时
发表于 2019-6-1 07:01:03 来自手机 | 显示全部楼层
好东西,一定要支持
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2019-4-29
在线时间
19 小时
发表于 2019-6-1 08:33:58 | 显示全部楼层
谢谢,
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2019-6-1
在线时间
1 小时
发表于 2019-6-1 10:27:43 | 显示全部楼层
必须支持
回复 支持 反对

使用道具 举报

0

主题

143

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2019-5-30
在线时间
4 小时
发表于 2019-6-1 13:54:22 | 显示全部楼层
支持支持
回复 支持 反对

使用道具 举报

16

主题

112

帖子

0

精华

高级会员

Rank: 4

积分
818
金钱
818
注册时间
2014-10-22
在线时间
589 小时
发表于 2019-6-1 14:14:26 | 显示全部楼层
gggggggggggggggggggggg
回复 支持 反对

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-6-1 14:26:31 | 显示全部楼层
你这能在单位推广开吗?
回复 支持 反对

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2019-6-1 14:57:51 | 显示全部楼层
谢谢楼主分享~
回复 支持 反对

使用道具 举报

31

主题

1951

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4416
金钱
4416
注册时间
2018-5-11
在线时间
922 小时
 楼主| 发表于 2019-6-1 15:56:44 | 显示全部楼层
nashui_sx 发表于 2019-6-1 14:26
你这能在单位推广开吗?

什么意思?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

1

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2019-5-4
在线时间
40 小时
发表于 2019-6-1 16:06:45 | 显示全部楼层
卧槽,大佬!我刚学32不到一个月,正在学F103的库函数版本,感谢分享!我下来试试
回复 支持 反对

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-6-1 16:56:50 | 显示全部楼层

打比方我们办公室都不允许不是office2016 以外的版本,这种大刀阔斧的改进,不论优劣,基本没法推进,自己用吧,自己写的代码别人也看不了,太小众了
最终结果就是不了了之
回复 支持 反对

使用道具 举报

31

主题

1951

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4416
金钱
4416
注册时间
2018-5-11
在线时间
922 小时
 楼主| 发表于 2019-6-1 17:37:11 | 显示全部楼层
nashui_sx 发表于 2019-6-1 16:56
打比方我们办公室都不允许不是office2016 以外的版本,这种大刀阔斧的改进,不论优劣,基本没法推进,自 ...

有道理,这个就是所谓的生态了。
不过,如果不是团队作战的话,
自己玩玩还是不错的。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2014-8-21
在线时间
15 小时
发表于 2019-6-2 01:08:06 | 显示全部楼层
绝对支持啊~~~~~~~
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2019-6-2
在线时间
0 小时
发表于 2019-6-2 08:47:47 来自手机 | 显示全部楼层
大佬,牛。。。。
回复 支持 反对

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3447
金钱
3447
注册时间
2017-7-4
在线时间
869 小时
发表于 2019-6-2 10:06:19 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-6-2
在线时间
4 小时
发表于 2019-6-2 11:07:09 来自手机 | 显示全部楼层
好,大牛,高手
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-6-2
在线时间
4 小时
发表于 2019-6-2 11:08:08 来自手机 | 显示全部楼层
不错,写的很好
回复 支持 反对

使用道具 举报

31

主题

1951

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4416
金钱
4416
注册时间
2018-5-11
在线时间
922 小时
 楼主| 发表于 2019-6-2 13:35:40 | 显示全部楼层
本帖最后由 warship 于 2019-6-2 13:38 编辑
nashui_sx 发表于 2019-6-1 16:56
打比方我们办公室都不允许不是office2016 以外的版本,这种大刀阔斧的改进,不论优劣,基本没法推进,自 ...

我又考虑了一下,其实并不太存在您的顾虑。
一、这只不过是一个头文件而已,并不对编译器有额外的需求,兼容能力强,处处可用。
二、虽然看似有些大刀阔斧,其实所运用的方法单一,只不过制作这个头文件工作量比较大而已,其实本质上类似于寄存器编程,将寄存器繁琐的编程助记化而已,编程出的每一句几乎都可以对应到寄存器操作的语句,基本不存在别人看不懂的问题,其实比寄存器编程更容易让别人懂。
三、这种硬件开发工作,团队作战比较少。至少也是一个人负责某个或某几个硬件模块,在代码模块上基本没有共享合作的需求,即使有,只不过多了一个头文件而已,对应的意义很容易查到。
四、其实所谓的寄存器、或库编程大多都只是对硬件外设进行初始化(其次是读取状态、标志等情况)才需要用到,对一个STM32工程来说,该部分代码整体占比并不大(但往往就是这部分硬件关联度大的工作难住了一些偏软的码农),绝大部分的代码还是用标准语句编写的逻辑或算法,所以应该无关宏旨。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

0

主题

43

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1713
金钱
1713
注册时间
2017-2-22
在线时间
296 小时
发表于 2019-6-2 13:49:18 | 显示全部楼层
看看怎样。。。。。
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-5-16
在线时间
2 小时
发表于 2019-6-2 14:12:24 | 显示全部楼层
觉得这个可行,基于图灵思想的计算机系统只有01,都是对位的操作,定义那么多函数不如直接位操作来得快。
回复 支持 反对

使用道具 举报

31

主题

1951

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4416
金钱
4416
注册时间
2018-5-11
在线时间
922 小时
 楼主| 发表于 2019-6-2 14:45:30 | 显示全部楼层
本帖最后由 warship 于 2019-6-2 15:27 编辑
edmund1234 发表于 2019-6-2 14:12
差不多所有寄存器的位, ST都做了宏的, 你再搞一套?

没错,比如,ST的宏定义是:
/********************  Bit definition for CAN_ESR register  *******************/
#define  CAN_ESR_EWGF                        ((uint32_t)0x00000001)        /*!< Error Warning Flag */
#define  CAN_ESR_EPVF                        ((uint32_t)0x00000002)        /*!< Error Passive Flag */
#define  CAN_ESR_BOFF                        ((uint32_t)0x00000004)        /*!< Bus-Off Flag */


请问你怎么用?可能必须这样:(BOFF位清0)    CAN->ESR &= ~CAN_ESR_BOFF;
                       (BOFF位置1)    CAN->ESR |= CAN_ESR_BOFF;
据我观察,很少有几个人这么用的,
并且上述使用的是典型的读-改-写三步曲
事实上我是基于单BIT位段操作,宏定义后,直接用类似 bCAN_ESR_BOFF=1或0;

再考虑到多个CAN口的因素,最后我的宏定义是:
/********************   ESR 错误状态寄存器  *******************/
#define  bCAN_ESR_EWGF(CANx_BASE)     BIT_ADDR(CANx_BASE+0x018,0)        /*!< Error Warning Flag */
#define  bCAN_ESR_EPVF(CANx_BASE)     BIT_ADDR(CANx_BASE+0x018,1)        /*!< Error Passive Flag */
#define  bCAN_ESR_BOFF(CANx_BASE)     BIT_ADDR(CANx_BASE+0x018,2)        /*!< Bus-Off Flag */

你可以看出,我实际上是抄了ST宏定义的文本,进行了批量转换编辑,这样就可以:
bCAN_ESR_BOFF(bCAN2)=1或0;    形式上简单多了,并且使用的是位段操作模式,不是读-改-写;




我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

0

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2019-5-10
在线时间
13 小时
发表于 2019-6-2 21:42:06 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2019-5-26
在线时间
6 小时
发表于 2019-6-2 23:48:12 来自手机 | 显示全部楼层
谢谢楼主分享,多谢了!
回复 支持 反对

使用道具 举报

33

主题

982

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7862
金钱
7862
注册时间
2014-8-13
在线时间
1584 小时
发表于 2019-6-3 01:38:19 | 显示全部楼层
感谢创造性分享 。
回复 支持 反对

使用道具 举报

33

主题

982

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7862
金钱
7862
注册时间
2014-8-13
在线时间
1584 小时
发表于 2019-6-3 07:11:04 | 显示全部楼层
感谢创造性分享
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2019-6-2
在线时间
0 小时
发表于 2019-6-3 08:09:06 来自手机 | 显示全部楼层
谢谢楼主,求解压密码
回复 支持 反对

使用道具 举报

0

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2019-4-11
在线时间
26 小时
发表于 2019-6-3 08:21:33 | 显示全部楼层

支持一下,顺便谢谢分享
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2014-8-21
在线时间
15 小时
发表于 2019-6-3 08:49:57 | 显示全部楼层
建议将头文件中的命名规范详细点,挂在GitHub上,一起维护
回复 支持 反对

使用道具 举报

55

主题

243

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1596
金钱
1596
注册时间
2012-12-30
在线时间
240 小时
发表于 2019-6-3 08:59:28 | 显示全部楼层
如果把其他几个系列都做上去就更好了
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2012-9-6
在线时间
10 小时
发表于 2019-6-3 09:57:39 | 显示全部楼层
楼主长时间努力得来的杰作。以后会不会流行呢?
回复 支持 反对

使用道具 举报

31

主题

1951

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4416
金钱
4416
注册时间
2018-5-11
在线时间
922 小时
 楼主| 发表于 2019-6-3 10:14:50 | 显示全部楼层
wgh1990 发表于 2019-6-3 08:59
如果把其他几个系列都做上去就更好了

先试试水,
如果受欢迎的话,
可以考虑进一步扩展。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-6-3
在线时间
2 小时
发表于 2019-6-3 11:28:16 | 显示全部楼层

stm32Hal库,F103
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 06:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表