main.c
这个不用解释了吧
stm32f10x.h
这个是头文件,它包含了stm32的一些常用宏,寄存器结构体的定义,高版本的库还放着中断向量表。
stm32f10x_rcc.c
这个文件里的固件函数包含了一些对复位、时钟的控制的函数
stm32f10x_gpio.c这个文件里的固件函数包含了对GPIO的操作函数
stm32_eval.c
这个是st公司为其制作的评估板写的程序
system_stm32f10x.c主要包含了对系统时钟设置,一般是对倍频时钟的设置
三、GPIO_InitTypeDef
GPIO_InitStructure;
ErrorStatus
HSEStartUpStatus;
u8
count=0;
四、void
Delay(vu32
nCount);
void
Turn_On_LED(u8
LED_NUM);
希望您能帮助我,我会给您高分的。回答:
1、因为引脚本来就是16个的啊,从pin0~pin15,GPIOA口有16个脚,GPIOB也有16个,GPIOC也有16个,是这样区分的,它是相对于一组io口的细分,ALL来代替的是选中了这一组io
2、不可以,呵呵你要选择到底是GPIOA还是GPIOB还是...C还是...D等等的GPIO_Pin_0
3、GPIO_InitTypeDef、ErrorStatus是两个结构体,u8是定义的unsigned
char你可以通过keil的go
to
definition选项找到它们的定义,这个是标准C的定义
嗯,是的C语言基础不太好,以前学单片机主要是用汇编。
回答:
『贰』 为什么linux中很多头文件没有呢譬如:gpio
Linux内核只有芯片商添加了驱动才会有对应的gpio函数,最好自己实现。寄存器的操作比较简单,直接写地址就可以了。注意把物理地址转换为虚拟地址。
『叁』 ARM单片机的头文件如何用结构体定义地
下面我们以ARM Cortex-M0内核单片机LPC1114的头文件lpc11xx.h文件进行说明。
1.先说两句
lpc11xx.h文件是lpc11xx系列单片机包含的头文件。这个文件的作用和51单片机中的reg51.h头文件是一个性质,都是用来定义寄存器在单片机中的地址的。
你现在就可以打开reg51.h文件和lpc11xx.h文件看看,对比后你会发现两个主要的区别,首先是lpc11xx.h文件的寄存器定义是用结构体的形式,而reg51.h文件中,寄存器的定义都是一条一条的很直接的地址定义。然后是reg51.h文件中有sfr这样的“伪c语言”,而lpc11xx.h中用的是标准的c语言。C语言的最大用武之地就是单片机,要想学c,就在单片机上学,要想学单片机,就先入门c语言。两者相辅相成的学,效果最好。学以致用,才是学习的最终目标。
2.lpc11xx.h文件中如何定义寄存器地址?
在文件中,定义寄存器地址用到了一下几方面的c语言基础知识:
结构体;
结构体指针;
宏定义#define
关键字typedef
关键字volatile
关键字const
lpc11xx.h文件中,把每个模块都定义了一个结构体,这些模块有SYSCON、IOCON、UART、GPIO、SSP、I2C、WDT、ADC等。
例如,下面是ADC模块的结构体定义:
typedef struct
{
__IO uint32_t CR;
__IO uint32_t GDR;
uint32_t RESERVED0;
__IO uint32_t INTEN;
__IO uint32_t DR[8];
__I uint32_t STAT;
} LPC_ADC_TypeDef;
结构体的定义有三种形式,我们这里使用的是“直接说明变量”的形式。
lpc11xx.h文件的第566~584行,给每个模块的结构体变量定义了结构体指针,并加了宏定义#define,为的是以后写程序时书写方便。
把鼠标放到uint32_t上面,单击鼠标右键,在弹出的菜单中选择“Go To Definition Of ‘uint32_t’”,如下图所示:
选择后,就会跳到它的定义之处,如下图所示:
typedef是类型重定义关键字,所以实际上,CR寄存器的定义是这样的:
__IO unsigned int CR;
按照同样的方法,可以找到__IO的定义为:
所以,CR寄存器定义实际上是:
volatile unsigned int CR;
volatile关键字的作用是为了让编译器不要优化这个变量。
unsigned int关键字,用来定义无符号的整形变量。
这时候,有人会问,为什么不直接写成这样呢?答:为了阅读方便。
__IO uint32_t CR;
看到这条语句,我们就会知道,CR寄存器是一个“32位的可读可写寄存器”。
volatile unsigned int CR;
同样的这句话,我们对它的了解就不是那么一目了然了。
3.如何查看每个寄存器的地址?
上面讲到,寄存器的地址是由结构体和结构体指针定义的。现在我们来验证一下它的正确性。
我们随便找个寄存器,比如ADC模块的INTEN寄存器(ADC中断允许寄存器),打开LPC1114的用户手册,找到第25章ADC模块部分,如下图所示:
从上面图中,可以看到INTEN的寄存器的地址是0x4001C00C,接下来,我们打开lpc11xx.c文件来验证一下吧。
打开lpc11xx.c文件,找到ADC模块的结构体,如下图所示:
然后再找到LPC_ADC_TypeDef的结构体指针,如下所示:
结构体指针就是用来指向一个地址的,我们来看看上面语句中的LPC_ADC_BASE是什么:
再看看上条语句中的LPC_APB0_BASE是什么:
现在终于挖到底了,原来LPC_ADC_TypeDef指针指向的地址为:
0x40000000+0x1C000=0x4001C000
c语言基础知识:结构体的第一个变量的地址=结构体指针的地址。
所以结构体的第一个变量地址就是0x4001C000,INTEN前面有3个4字节的变量,所以INTEN的地址就是0x4001C00C。
验证完毕。
4.程序中,如何操作寄存器?
C语言基础知识:用结构体变量指针访问结构体中的变量,形式有两种:
*结构体指针变量.变量名
结构体指针变量->变量名
还是拿INTEN寄存器为例,假设我们要给这个寄存器写0x837,可以这样写:
*LPC_ADC.INTEN=0x837;
LPC_ADC->INTEN=0X837;
以上两种形式,在写程序的时候,都可以用。人们习惯用第二种形式。
『肆』 stm32头文件问题
因为,stm32f10x.h中包含了一系列的标准库头文件,其中就包括了stm32f10x_gpio.h,但是,一定要确保宏配制正确!
查看一下stm32f10x.h源代码就清楚了
『伍』 STM32寄存器头文件定义
这个是寄存器地址的操作问题,地址值,这个地址(或理解为指针)是UINT型而已,对着数据手册就看明白了。
『陆』 STM32 中_IO 在哪里定义具体的头文件名称是什么
#define __I volatile const /*!< defines 'read only' permissions */
#define __O volatile /*!< defines 'write only' permissions */
#define __IO volatile /*!< defines 'read / write' permissions */
位于core_cm3.h
『柒』 AM335X 在linux下如何获取某个GPIO口的中断,需要速度很快响应处理该中断,如果有示例代码最好,谢谢。
gpio_to_irq
『捌』 linux系统中驱动程序中一些头文件地址的问题
e.h> 模块头文件
#include <linux/kernel.h> 驱动要写入内核,与内核相关的头文件
#include <linux/fs.h> 文件系统头文件
#include <linux/init.h> 初始化头文件
#include <linux/delay.h> 延时头文件
#include <asm/irq.h> 与处理器相关的中断
#include <linux/interrupt.h> 操作系统中断
#include <asm/uaccess.h> 与处理器相关的入口
//#include <asm/arch/regs-gpio.h> 与处理器相关的IO口操作
#include <mach/regs-gpio.h> 同上
//#include <asm/hardware.h> 与处理器相关的硬件
#include <mach/hardware.h> 同上
#include <linux/device.h> 设备驱动文件
#include <linux/poll.h> 轮询文件
#include <linux/gpio.h> 操作系统相关的IO口文件
#include <stdio.h> 标准输入输出
#include <stdlib.h> 标准库
#include <unistd.h>
#include <sys/ioctl.h> IO控制
以下6个是提供的函数中所需的头文件
具体我也不详
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/select.h>
#include <sys/time.h>
#include <errno.h>
『玖』 请教pandaboard上omap4460的GPIO用作外部中断引脚的配置方法!!
你的引脚要配置成GPIO模式,在board_omap4_panda.c里面,因为pandaboard的引脚配置大部分在uboot里面,只有少量临时的配置在board_omap4_panda.c里面
『拾』 gpio中断和irq中断的区别
这个需要IOxAPIC,把GPIOmap到什么PIRQX上,然后IRQ24——39对应PIRQx……GPIO就是typein,不用复用。
就这样玩?不过用GPIO做一个SMI,SCI不是简单点啊