什么样的gpio才需要用can_sleep


对于有些挂载在I2C,SPI总线上的扩展GPIO,读写操作可能会导致睡眠,因此不能在中断函数中

  使用。使用下面的函数以区别于正常的GPIO
  int gpio_get_value_cansleep(unsigned gpio);//读GPIO
  void gpio_set_value_cansleep(unsigned gpio, int value);//写GPIO
 
-------------------------------------------
 
这句话的意思:如果soc本身(比如100个)gpio不够用, 那么就要另外接一个gpio controller, 上面再提供额外的50个gpio,这个controller连接到soc上是通过总线比如i2c总线连上去的。这个时候写gpio值,就是通过i2c总线去写新加的那个gpio controller的寄存器的值,所以有可能会有睡眠发生,所以要用can_sleep.
 
 
 
====================================================
 
gpio
 
======
  头文件:linux/gpio.h
  实现文件:driver/gpio/gpiolib.c
  参考文件:Doccumentation/gpio.txt
 
 
准备工作
------------
  为了驱动具体的设备,驱动程序常常需要 系统中的各类资源进行申请,形如以下调用
  -->gpio_request(gpio_num, "led gpio"); //申请GPIO,用做led
  -->request_irq(irq_no, irq_handler, IRQF_DISABLED, irq_name, &irq_data);//申请中断
  
  上述gpio_request()就实现了对应GPIO申请的功能。设备驱动程序如果要获得kernel GPIO模块的
  支持(gpio_request能用...),需要完成如下步骤
  -->Platforms must declare GENERIC_GPIO support in their Kconfig (boolean true)
  -->在模块Kconfig中加入depends on GENERIC_GPIO,对于必须使用GPIO的模块
  -->#inlcude <linux/gpio.h>
  
使用gpio
----------
  准备工作做完之后,就可以申请GPIO然后使用了。下面是使用GPIO的一般性过程
  申请GPIO->设置GPIO方向->设置其他功能(上拉,下拉)->输入或输出值->释放GPIO
  相应的函数如下
  int gpio_request(unsigned gpio, const char *label);//申请GPIO
  void gpio_free(unsigned gpio);//释放GPIO
 
 
  int gpio_direction_input(unsigned gpio);//设置为输入
  int gpio_direction_output(unsigned gpio, int value);//设置为输出
 
 
  int gpio_set_debounce(unsigned gpio, unsigned debounce);
  
  int __gpio_get_value(unsigned gpio);//读GPIO 通常是inline函数
  void __gpio_set_value(unsigned gpio, int value);//设置GPIO
 
 
  对于有些挂载在I2C,SPI总线上的扩展GPIO,读写操作可能会导致睡眠,因此不能在中断函数中
  使用。使用下面的函数以区别于正常的GPIO
  int gpio_get_value_cansleep(unsigned gpio);//读GPIO
  void gpio_set_value_cansleep(unsigned gpio, int value);//写GPIO



【 /* CAN 外设选择 */ #define CANx CAN1 #define CAN_CLK RCC_APB1Periph_CAN1 /* GPIO 配置 */ #define CAN_GPIO_PORT GPIOD #define CAN_GPIO_CLK RCC_AHB1Periph_GPIOD #define CAN_RX_PIN GPIO_Pin_0 #define CAN_TX_PIN GPIO_Pin_1 #define CAN_RX_PIN_SOURCE GPIO_PinSource0 #define CAN_TX_PIN_SOURCE GPIO_PinSource1 #define CAN_GPIO_AF GPIO_AF_CAN1 void bsp_can_Init(void) { /* 时钟 -----------------------------------------------------------*/ RCC_AHB1PeriphClockCmd(CAN_GPIO_CLK, ENABLE); RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE); /* GPIO -----------------------------------------------------------*/ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = CAN_RX_PIN | CAN_TX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(CAN_GPIO_PORT, &GPIO_InitStructure); /* PD0 -> CAN1_RX, PD1 -> CAN1_TX */ GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_RX_PIN_SOURCE, CAN_GPIO_AF); GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_TX_PIN_SOURCE, CAN_GPIO_AF); /* CAN 初始化 -----------------------------------------------------*/ CAN_InitTypeDef CAN_InitStructure; CAN_StructInit(&CAN_InitStructure); // 先全部缺省 CAN_InitStructure.CAN_TTCM = DISABLE; CAN_InitStructure.CAN_ABOM = DISABLE; CAN_InitStructure.CAN_AWUM = DISABLE; CAN_InitStructure.CAN_NART = DISABLE; CAN_InitStructure.CAN_RFLM = DISABLE; CAN_InitStructure.CAN_TXFP = DISABLE; CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; /* 42 MHz / 21 / (1 + 10 + 3) = 125 kbit/s */ CAN_InitStructure.CAN_SJW = CAN_SJW_2tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_10tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq; CAN_InitStructure.CAN_Prescaler = 21; CAN_Init(CANx, &CAN_InitStructure); /* 过滤器 ---------------------------------------------------------*/ CAN_FilterInitTypeDef CAN_FilterInitStructure; CAN_FilterInitStructure.CAN_FilterNumber = 0; CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); printf("Can_Bus init success !\r\n"); }】 这是我的代码,如果修改引脚为默认的PA11、12引脚怎么修改
最新发布
09-04
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值