当前位置: 首页 > news >正文

建设网站会员汕头网站推广费用

建设网站会员,汕头网站推广费用,蜘蛛不抓取网站的原因,网站域名切换对于标准的外设如LED#xff0c;KEY#xff0c;PWM等#xff0c;以及标准通信协议#xff0c;Linux都自带有标准的驱动库#xff0c;不需要我们自行编写#xff0c;只需要配置好相应的GPIO属性和电气属性#xff0c;即可匹配相应的驱动#xff0c;在应用程序中直接使用… 对于标准的外设如LEDKEYPWM等以及标准通信协议Linux都自带有标准的驱动库不需要我们自行编写只需要配置好相应的GPIO属性和电气属性即可匹配相应的驱动在应用程序中直接使用相应的外设。 学习视频地址【正点原子】STM32MP157开发板 驱动流程 使能Linux内核相关库make menuconfig编写GPIO电气属性文件路径Linux内核路径/arch/arm/boot/dts/stm32mp15-pinctrl.dtsi添加设备树节点匹配属性及驱动文件路径Linux内核路径/arch/arm/boot/dts/stm32mp157d-atk.dts编写相应的应用程序或者直接命令行调用 LED 驱动使能 电气属性 /* gpio led config */ led_pins_a: gpioled-0 {pins {pinmux STM32_PINMUX(I, 0, GPIO), /* LED0 */STM32_PINMUX(F, 3, GPIO); /* LED1 */drive-push-pull;bias-pull-up;output-high;slew-rate 0;}; };设备树节点 gpio-leds{compatible gpio-leds;pinctrl-0 led_pins_a;led0 {label red;gpios gpioi 0 GPIO_ACTIVE_LOW;linux,default-trigger heartbeat;default-state on;};led1 {label green;gpios gpiof 3 GPIO_ACTIVE_LOW;default-state off;};}; 应用指令 echo 1 /sys/class/leds/red/brightness #打开 LED0 echo 0 /sys/class/leds/red/brightness #关闭 LED0KEY 驱动使能 电气属性 /* gpio key config */key_pins_a: key_pins-0 {pins1 {pinmux STM32_PINMUX(G, 3, GPIO), /* KEY0 */STM32_PINMUX(H, 7, GPIO); /* KEY1 */bias-pull-up;slew-rate 0;};pins2 {pinmux STM32_PINMUX(A, 0, GPIO); /* WK_UP */bias-pull-down;slew-rate 0;};};设备树节点 gpio-keys{compatible gpio-keys;pinctrl-names default;pinctrl-0 key_pins_a;autorepeat; /* 支持连按 */key0{label GPIO KEY L;linux,code KEY_L;gpios gpiog 3 GPIO_ACTIVE_LOW;};key1{label GPIO KEY S;linux,code KEY_L;gpios gpioh 7 GPIO_ACTIVE_LOW;};wkup{label GPIO KEY Enter;linux,code KEY_ENTER;gpios gpioa 0 GPIO_ACTIVE_HIGH;gpio-key,wakeup;}; };应用指令 hexdump /dev/input/event0 #查看按键事件的原始值PWM 驱动使能 电气属性 /* pwm1 config */ pwm1_pins_a: pwm1-0 {pins {pinmux STM32_PINMUX(A, 10, AF1); /* TIM1_CH3 */bias-pull-down;drive-push-pull;slew-rate 0;}; };pwm1_sleep_pins_a: pwm1-sleep-0 {pins {pinmux STM32_PINMUX(A, 10, ANALOG); /* TIM1_CH3 */}; };设备树节点 /* 官方文件中已有定时器节点但是默认是失能的所以需要在应用时追加定时器配置 */ timers1 {status okay;/* spare all DMA channels since they are not needed for PWM output *//delete-property/dmas;/delete-property/dma-names;pwm1: pwm {pinctrl-0 pwm1_pins_a;pinctrl-1 pwm1_sleep_pins_a;pinctrl-names default, sleep;#pwm-cells 2;status okay;}; };检验 因为我们需要调用pwm下的pwmchipx来控制某路PWM所以我们需要先确认pwmchipx是否对应我们使用的定时器timer。 cd pwmchip0这时会打印出以下信息我们需要匹配定时器的寄存器地址以及该pwm设备的寄存器地址。可以看到地址都是44000000说明这个pwm设备对应的定时器就是timer1。 应用指令 echo 2 /sys/class/pwm/pwmchip0/export # 开启TIM1_CH3 echo 50000 /sys/class/pwm/pwmchip0/pwm2/period # 设置周期值为50000ns echo 10000 /sys/class/pwm/pwmchip0/pwm2/duty_cycle # 设置一个周期值中高电平的时间即间接设置占空比 echo 1 /sys/class/pwm/pwmchip0/pwm2/enable # 使能PWM需要设置好周期和占空比再使能否则会报错 echo inversed /sys/class/pwm/pwmchip0/pwm2/polarity #极性反转 echo normal /sys/class/pwm/pwmchip0/pwm2/polarity #极性恢复I2C I2C子系统架构 I2C适配器驱动SOC厂商已经写好了所以我们只需要写I2C设备驱动即可。 电气属性 i2c5_pins_a: i2c5-0 {pins {pinmux STM32_PINMUX(A, 11, AF4), /* I2C5_SCL */STM32_PINMUX(A, 12, AF4); /* I2C5_SDA */bias-disable;drive-open-drain;slew-rate 0;}; };i2c5_pins_sleep_a: i2c5-1 {pins {pinmux STM32_PINMUX(A, 11, ANALOG), /* I2C5_SCL */STM32_PINMUX(A, 12, ANALOG); /* I2C5_SDA */}; };设备树节点 以正点原子STM32MP1开发板上的AP3216C传感器为例它挂载在I2C5总线上。 i2c5 {pinctrl-names default, sleep;pinctrl-0 i2c5_pins_a;pinctrl-1 i2c5_pins_sleep_a;status okay;/* 1e代表器件地址 */ap3216c1e {compatible alientek,ap3216c;reg 0x1e;}; };驱动代码 下面的两个函数是i2c设备最主要的数据读写函数设备的驱动就在这个基础上通过对不同寄存器的读写实现。i2c总线设备的操作与platform总线类似。 /** description : 从ap3216c读取寄存器数据* param - dev: ap3216c设备* param - reg: 要读取的寄存器首地址* param - val: 读取到的数据* param - len: 要读取的数据长度* return : 操作结果*/ static int ap3216c_read_regs(struct ap3216c_dev *dev, u8 reg, void *val, int len) {int ret;struct i2c_msg msg[2];struct i2c_client *client (struct i2c_client *)dev-client;/* msg[0]为发送要读取的首地址 */msg[0].addr client-addr; /* ap3216c地址 */msg[0].flags 0; /* 标记为发送数据 */msg[0].buf reg; /* 读取的首地址 */msg[0].len 1; /* reg长度*//* msg[1]读取数据 */msg[1].addr client-addr; /* ap3216c地址 */msg[1].flags I2C_M_RD; /* 标记为读取数据*/msg[1].buf val; /* 读取数据缓冲区 */msg[1].len len; /* 要读取的数据长度*/ret i2c_transfer(client-adapter, msg, 2);if(ret 2) {ret 0;} else {printk(i2c rd failed%d reg%06x len%d\n,ret, reg, len);ret -EREMOTEIO;}return ret; }/** description : 向ap3216c寄存器写入数据* param - dev: ap3216c设备* param - reg: 要写入的寄存器首地址* param - val: 要写入的数据缓冲区* param - len: 要写入的数据长度* return : 操作结果*/ static s32 ap3216c_write_regs(struct ap3216c_dev *dev, u8 reg, u8 *buf, u8 len) {u8 b[256];struct i2c_msg msg;struct i2c_client *client (struct i2c_client *)dev-client;b[0] reg; /* 寄存器首地址 */memcpy(b[1],buf,len); /* 将要写入的数据拷贝到数组b里面 */msg.addr client-addr; /* ap3216c地址 */msg.flags 0; /* 标记为写数据 */msg.buf b; /* 要写入的数据缓冲区 */msg.len len 1; /* 要写入的数据长度 */return i2c_transfer(client-adapter, msg, 1); }SPI SPI总线的操作与I2C总线操作相似。 电气属性 spi1_pins_a: spi1-0 {pins1 {pinmux STM32_PINMUX(Z, 0, AF5), /* SPI1_SCK */STM32_PINMUX(Z, 2, AF5); /* SPI1_MOSI */bias-disable;drive-push-pull;slew-rate 1;};pins2 {pinmux STM32_PINMUX(Z, 1, AF5); /* SPI1_MISO */bias-disable;};pins3 {pinmux STM32_PINMUX(Z, 3, GPIO); /* SPI1_NSS */bias-pull-up;drive-push-pull;output-high;slew-rate 0;}; };spi1_sleep_pins_a: spi1-sleep-0 {pins {pinmux STM32_PINMUX(Z, 0, ANALOG), /* SPI1_SCK */STM32_PINMUX(Z, 1, ANALOG), /* SPI1_MISO */STM32_PINMUX(Z, 2, ANALOG); /* SPI1_MOSI */STM32_PINMUX(Z, 3, ANALOG); /* SPI1_NSS */}; };设备树节点 spi1 {pinctrl-names default, sleep;pinctrl-0 spi1_pins_a;pinctrl-1 spi1_sleep_pins_a;cs-gpios gpioz 3 GPIO_ACTIVE_LOW;status okay;spidev: icm206080 {compatible alientek,icm20608;reg 0; /* CS #0 */spi-max-frequency 8000000;}; };驱动代码 /** description : 从icm20608读取多个寄存器数据* param - dev: icm20608设备* param - reg: 要读取的寄存器首地址* param - val: 读取到的数据* param - len: 要读取的数据长度* return : 操作结果*/ static int icm20608_read_regs(struct icm20608_dev *dev, u8 reg, void *buf, int len) {int ret -1;unsigned char txdata[1];unsigned char * rxdata;struct spi_message m;struct spi_transfer *t;struct spi_device *spi (struct spi_device *)dev-spi;t kzalloc(sizeof(struct spi_transfer), GFP_KERNEL); /* 申请内存 */if(!t) {return -ENOMEM;}rxdata kzalloc(sizeof(char) * len, GFP_KERNEL); /* 申请内存 */if(!rxdata) {goto out1;}/* 一共发送len1个字节的数据第一个字节为寄存器首地址一共要读取len个字节长度的数据*/txdata[0] reg | 0x80; /* 写数据的时候首寄存器地址bit8要置1 */ t-tx_buf txdata; /* 要发送的数据 */t-rx_buf rxdata; /* 要读取的数据 */t-len len1; /* t-len发送的长度读取的长度 */spi_message_init(m); /* 初始化spi_message */spi_message_add_tail(t, m);/* 将spi_transfer添加到spi_message队列 */ret spi_sync(spi, m); /* 同步发送 */if(ret) {goto out2;}memcpy(buf , rxdata1, len); /* 只需要读取的数据 */out2:kfree(rxdata); /* 释放内存 */ out1: kfree(t); /* 释放内存 */return ret; }/** description : 向icm20608多个寄存器写入数据* param - dev: icm20608设备* param - reg: 要写入的寄存器首地址* param - val: 要写入的数据缓冲区* param - len: 要写入的数据长度* return : 操作结果*/ static s32 icm20608_write_regs(struct icm20608_dev *dev, u8 reg, u8 *buf, u8 len) {int ret -1;unsigned char *txdata;struct spi_message m;struct spi_transfer *t;struct spi_device *spi (struct spi_device *)dev-spi;t kzalloc(sizeof(struct spi_transfer), GFP_KERNEL); /* 申请内存 */if(!t) {return -ENOMEM;}txdata kzalloc(sizeof(char)len, GFP_KERNEL);if(!txdata) {goto out1;}/* 一共发送len1个字节的数据第一个字节为寄存器首地址len为要写入的寄存器的集合*/*txdata reg ~0x80; /* 写数据的时候首寄存器地址bit8要清零 */memcpy(txdata1, buf, len); /* 把len个寄存器拷贝到txdata里等待发送 */t-tx_buf txdata; /* 要发送的数据 */t-len len1; /* t-len发送的长度读取的长度 */spi_message_init(m); /* 初始化spi_message */spi_message_add_tail(t, m);/* 将spi_transfer添加到spi_message队列 */ret spi_sync(spi, m); /* 同步发送 */if(ret) {goto out2;}out2:kfree(txdata); /* 释放内存 */ out1:kfree(t); /* 释放内存 */return ret; }UART/RS232/RS485 Linux也提供了串口相关的驱动库供我们使用。 usart3_pins_c: usart3-2 {pins1 {pinmux STM32_PINMUX(D, 8, AF7); /* USART3_TX */bias-disable;drive-push-pull;slew-rate 0;};pins2 {pinmux STM32_PINMUX(D, 9, AF7); /* USART3_RX */bias-disable;}; };usart5_pins_a: usart5-0 {pins1 {pinmux STM32_PINMUX(B, 13, AF14); /* USART5_TX */bias-disable;drive-push-pull;slew-rate 0;};pins2 {pinmux STM32_PINMUX(B, 12, AF14); /* USART5_RX */bias-disable;}; };设备树节点 aliases节点用于设置串口别名串口驱动会读取aliases节点数据表示在系统启动生成一个名为“/dev/ttySTM0”的设备文件,serial1就会生成“/dev/ttySTM1”如此类推,最多 8 个。 # 这个在根节点下 /{ ......aliases {serial0 uart4;serial1 uart5;serial2 usart3;}; ...... };usart3 {pinctrl-names default;pinctrl-0 usart3_pins_c;status okay; };uart5 {pinctrl-names default;pinctrl-0 usart5_pins_a;status okay; };串口软件移植 minicom 类似我们常用的串口调试助手,是 Linux 下很常用的一个串口工具builroot里面已经集成了这个软件所以只需重新配置builroot就行。 sudo make # 保持上述配置后进行编译 cd output/images/ #进入到 output/images 目录 sudo tar -axvf rootfs.tar -C /home/jozenlee/arm_linux/nfs/rootfs #解压到 nfsroot 目录minicom配置 minicom -s #打开配置界面CAN STM32MP1提供的是功能更强大的FDCAN控制器支持数据高速传输并且数据量从8位加到了64位 电气属性 m_can1_pins_a: m-can1-0 {pins1 {pinmux STM32_PINMUX(H, 13, AF9); /* CAN1_TX */slew-rate 1;drive-push-pull;bias-disable;};pins2 {pinmux STM32_PINMUX(I, 9, AF9); /* CAN1_RX */bias-disable;}; };m_can1_sleep_pins_a: m_can1-sleep-0 {pins {pinmux STM32_PINMUX(H, 13, ANALOG), /* CAN1_TX */STM32_PINMUX(I, 9, ANALOG); /* CAN1_RX */}; };设备树节点 m_can1 {pinctrl-names default, sleep;pinctrl-0 m_can1_pins_a;pinctrl-1 m_can1_sleep_pins_a;status okay; };软件移植 iproute2 can-utils 应用指令 # 设置 can0 速度为 1000Kbit/s使用的是一般模式 ip link set can0 type can bitrate 1000000 # 设置 can0 速度为 1000Kbit/s数据波特率为 5000 kBit/s使用FDCAN ip link set can0 up type can bitrate 1000000 dbitrate 5000000 fd on ip link set can0 up type can bitrate 200000 dbitrate 1000000 fd on ip link set can0 up type can bitrate 100000 dbitrate 500000 fd on# 打开can0 ifconfig can0 up# 关闭can0 ifconfig can0 down# 接收数据 candump can0# 发送数据 cansend can0 5A1#11.22.33.44.55.66.77.88
http://www.tj-hxxt.cn/news/136749.html

相关文章:

  • 数据库课程设计报告网站开发网络推广公司哪个好
  • 邯郸做移动网站的地方网站建设公司成就
  • 赣州网站建设优化服务网站开发合同变更
  • 做的比较好的手机网站付费网站搭建
  • 网站建设范围百度知道个人中心
  • 合肥企业网站建设公司哪家好餐饮公司网站模板下载
  • 网站建设手机网站免费下载代码项目的网站
  • 黄石有哪些做视觉网站的公司网站 app微信三合一
  • 百度做公司网站360站长工具
  • 信用建设网站动态信息报送制度云软件网站建设
  • 网站搭建的意义rust做网站
  • 环保主题静态网站廊坊网站关键词推广
  • 怎么做网站代拍2023网页设计十大品牌
  • 案例学——网页设计与网站建设泡泡h5网页制作
  • 怎么做网站导航三门峡做网站
  • 网站建设格局网页小游戏下载
  • 建材做哪些网站好重庆经典论坛新闻评论
  • 网站建设的功能有哪些在网站上做漂浮
  • 网站站点地图网站特色栏目重要性
  • 如何建立自己公司的官方网站wordpress 头像 很慢
  • 免费com域名注册网站聊城专业网站制作公司
  • 深圳宝安p2p网站系统的建设天津制作企业网站报价
  • 安徽省和住房建设厅网站河北建设厅网站开通账号
  • 企业建设网站的目的是什么免费
  • 一个网站的构建TP5.1做的网站首页被挂马原因
  • 佛山企业网站建设中国建设银行网站查询
  • 卖磁铁的网站怎么做长沙优化科技有限公司地址
  • 微网站开发 在线商城打广告专用配图
  • a站网址是什么网店运营实训报告总结
  • 成都建设厅官方网站清苑住房和城乡建设局网站