野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16339|回复: 10

新人对库开发的一点困惑。。。

[复制链接]
发表于 2014-12-31 19:34:14 | 显示全部楼层 |阅读模式
一直在看stm32库开发指南,,已经看完初级篇了,,前几天驱动12864,问了个关于端口的问题,,有人教我说提取整个gpio口,然后只对其中的8位操作,屏蔽掉另外的8位数据。。。。我能说我当时就懵了麼。。。库开发指南里我看到现在也没有说如何直接操纵端口啊,,,然后就是一顿翻固件函数库,,也是没有找到关于 只对其中的8位操作,屏蔽掉另外的8位数据 的相关的函数。。。网上搜出来的答案全都是对寄存器进行直接赋值,,我想知道的是 库开发如何做到呢?还是相比于寄存器开发,库开发还是有一定的缺陷??或者是我没有找对地方麼。。。。。真心懵住了。。。。求大神给解解惑。。。。。
回复

使用道具 举报

发表于 2015-1-2 08:15:46 | 显示全部楼层
我也有同样的疑问.像驱动液晶显示一般用并口,8位或16位,例程中显然有LCD驱动程序,但是借用的是存储器FMSC接口,对于12864读写来说,要求的速度比较慢,用这个接口不一定合适,另外12864是8位数据口,占用一个16位接口的全部也不太合适
回复 支持 反对

使用道具 举报

发表于 2015-1-2 09:52:45 | 显示全部楼层
123.png

1、可以通过操作寄存器的方式来实现,可以通过读取端口的IDR这个寄存器来获得数据
     如果是输出数据的话,可以往ODR这个寄存器赋值来达到效果。

    如果你用的是端口B的低8bit,输入:  data =  GPIOB->IDR & 0x0f,这样就把低8bit的数据取出来了
   输出:  GPIOB->ODR & 0x0f = data ,这样就把数据通过低8bit输出了。


2、可以通过操作库函数的方式来实现,其实库函数的底层跟上面的寄存器操作是一样的。
     在 库文件  stm32f10x_gpio.h  里面有所有关于GPIO操作的函数,有单独读一个IO的,也有一次性读取16个IO的
    如果你操作的12864是8bit的,那么可以通过运算把低8bit取出来即可。
    325.png
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

上面这几个库函数就是对单个IO和单个端口操作的库函数。
我们拿单个读端口的函数原型看看,看看他的底层是不是跟我们第一点的方法一致

/**
  * @brief  Reads the specified GPIO input data port.
  * @param  GPIOx: where x can be (A..G) to select the GPIO peripheral.
  * @retval GPIO input data port value.
  */
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
{
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

  return ((uint16_t)GPIOx->IDR);
}


红色的部分操作的就是数据输入寄存器IDR,跟我们操作寄存器的方法是一样的,库只不过是把这些最底层的封装成函数而已

3、无论是库函数还是寄存器操作,其实本质都是一样的,库函数只是把寄存器这些底层操作封装成了函数的样子,方便我们调用
     如果我们还是操作寄存器来开发的话,那么我们就需要通过数据手册找到IDR这个寄存器,然后去看每一bit的含义,当然,有人
    会说,查看寄存器有什么麻烦,可是STM32的寄存器是何其之多,稍微不注意还会搞错,开发周期还十分漫长,这就是用寄存器开发的一个弊端,
    如果是库函数开发的话,我们只需要调用相应的函数即可,至于里面是操作哪些寄存器,我们都可以不用知道,这可以大大加快开发的速度,
    就好像我们在学习C语言的时候,都是了解了 printf()函数的格式和用法,又有谁刻意去深究printf()里面是怎么实现的呢?它是如何操作寄存器的呢?答案是 没有。

4、综上,库开发就是寄存器开发,他们直接没有实质性的区别,大家不用太纠结。
回复 支持 反对

使用道具 举报

发表于 2015-1-2 09:57:29 | 显示全部楼层
11kxmx 发表于 2015-1-2 08:15
我也有同样的疑问.像驱动液晶显示一般用并口,8位或16位,例程中显然有LCD驱动程序,但是借用的是存储器F ...

你说的12864不需要用液晶专用的FSMC接口
你只需要用普通的一个IO端口即可驱动了

然后调用相应的库函数即可
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
这些端口读到的是16bit的数据,你只需要把低8bit或者高8bit取出来即可,至于是低8bit还是高8bit就取决于你的硬件用的是哪些IO
回复 支持 反对

使用道具 举报

发表于 2015-1-2 10:00:08 | 显示全部楼层
如果还有什么疑问,可以再提出来。
回复 支持 反对

使用道具 举报

发表于 2015-1-2 12:34:46 | 显示全部楼层
可以直接驱动5V的12864液晶吗?串口驱动的
回复 支持 反对

使用道具 举报

发表于 2015-1-3 08:03:52 | 显示全部楼层
本帖最后由 11kxmx 于 2015-1-3 08:50 编辑
fire 发表于 2015-1-2 09:57
你说的12864不需要用液晶专用的FSMC接口
你只需要用普通的一个IO端口即可驱动了


谢谢火哥,驱动12864主要是向12864写入数据,库中的几个函数主要是读IO口,还有读写操作单个IO口,缺少一个向整个16位IO口写入数据(对外输出)的函数,应该包括3个函数,一个是写入16位数据,另外是分别向高8位和低8位分别写入8位数据 当然如果有16位写入的函数后,通过库函数uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)读ODR,然后将侍写入数据和0XFF00或0X00FF进行或运算后,再次16位写入,也可以完成8位输出功能的
不过直接操作寄存器也是挺简单的
假设已有函数GPIO_OutputData(GPIO_TypeDef* GPIOx,uint16_t  data)
然后要向其高8位输出数据uint8_t  a
可以进行如下操作
uint16_t  b=(a<<8)|0X00FF
uint16_t c=GPIO_ReadOutputData(GPIOB)
uint16_t d=b&c
GPIO_OutputData(GPIOB,d)
但现在并没有 GPIO_OutputData(GPIO_TypeDef* GPIOx,uint16_t  data)这个函数



回复 支持 反对

使用道具 举报

发表于 2015-1-3 08:23:04 | 显示全部楼层
11kxmx 发表于 2015-1-3 08:03
谢谢火哥,驱动12864主要是向12864写入数据,库中的几个函数主要是读IO口,还有读写操作单个IO口, ...

有输入的库函数就有输出的库函数

我截图那里红色框中就是输入的,接下来就是输出的,亲

认真看
回复 支持 反对

使用道具 举报

发表于 2015-1-3 09:01:34 | 显示全部楼层
本帖最后由 11kxmx 于 2015-1-3 09:06 编辑
fire 发表于 2015-1-3 08:23
有输入的库函数就有输出的库函数

我截图那里红色框中就是输入的,接下来就是输出的,亲


看到了
GPIO_Write(GPIO_TypeDef* GPIOx,uint16_t Port Val),真好
回复 支持 反对

使用道具 举报

发表于 2015-1-6 22:01:02 | 显示全部楼层
一次读取16个IO,有点浪费,外围直接加个74HC595移位寄存器 ,利用GPIO—????位 控制,不是更省资源,而且操作方便。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-16 19:43:33 | 显示全部楼层
fire 发表于 2015-1-2 09:52
1、可以通过操作寄存器的方式来实现,可以通过读取端口的IDR这个寄存器来获得数据
     如果是输出数 ...

多谢火哥,,受教了,,
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 06:47 , Processed in 0.034608 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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