软件模拟IIC从机 由于ic性能有限,没有硬件的iic外设,项目上有需要使用iic从机,所以自己写了个iic从机模块,执行效率还行可以10m主频的单片机最快可以接收到100K的速度。该模块需要资源,2个外部中断配置-上升下降沿中断,来模拟iic时序,芯片编译器的问题,对结构体不是很友好,所以这边没有使用结构体对变量打包,目前只实现了简单的接受和发送,不支持eeprom那种读写方式。两组io口配置,总共有4种状态:1 SDA下降沿中断SCL高电平 – 起始信号SCL低电平 – 数据0 或 ACK2 SDA上升沿中断
6脚三位一体数码管 最近遇到一个比较特别的数码管,6个引脚控制二十多个灯,和平常推的共阴共阳数码挂不同,经过分析,需要采用位扫描的方式,对每个灯进行等时长的扫描。例:第一个时间片点亮A1,1 输出高 2输出低 其他io高阻态(输入悬空),这样只有A1会被点亮,其他不亮,依次循环点亮所有灯第一步,先在visual studio 上实现控制逻辑,把所有灯io按顺序点亮,即com 和 segtypedef unsigned char u8;#define FIRST_PIN 1#define LAST_PIN 6vo
单片机任务注册执行定时任务 函数定时处理模块注册,将需要执行的定时处理代码的指针传递给timer0_function_register函数,并传递时间基数,定时器中断对应次数之后则会回调一次改函数。typedef struct { unsigned int time;/*TIMER周期的倍数。timer周期默认一般是2ms */ void (*fun)(void);}TIME_HANDLER_S;TIME_HANDLER_S timer_handle[20];static int handle_cnt = 0;void
linux驱动学习-linux中断程序编写流程 Linux中断:1、确定中断号2、申请中断号、request_irq 不用一定要释放free_irq3、编写中断服务函数request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev){ return request_threaded_irq(irq, handler, NULL, flags, name, dev);}中断的上
Makefile语法学习 好记心不如烂笔头。这份是个人学习imx6ull 裸机开发开发的makefile文件,参考资料《跟我一起写makefile》每条命令必须以tab键开始,make 命令会为 Makefile 中的每个以 TAB 开始的命令创建一个 Shell 进程去执行。规则:target … : prerequisites …command#后面的内容为注释使用变量 $(name)通配符 “*”,“?”和“[…]” ,同shell语法模式规则 % 表示任意%.o : %.c命令赋值符号的含义自动
log信息打印接口函数 printf函数在格式化输出时,向下调用了char putchar(char c);这个函数,在“stdio.h”里可以发现有这个函数,所以我们需要自己构造一个这样的函数,即通过串口putchar(),代码如下:/*stm32f103 寄存器操作*/char putchar(char c){ while((USART1->SR&0X40)==0);//循环发送,直到发送完毕 USART1->DR = (u8) ch; return c;}#ifn
makefile参数传递,gcc给c文件传递宏参数 代码写好之后有时候需要在编译的时候选择编译哪部分代码,通过gcc参数 -D给c文件传递宏参数,下面是具体实现,-D和参数中间空格可以省略makefile参数传递,make para=value#include <stdio.h>#ifdef DEBUGconst char *g_vision = "宏参数是debug"; #else /* DEBUG */const char *g_vision = "宏参数是relese"; #endif /* DEBUG */#if (F
freertos基础学习--任务通知 发送通知函数,向对应任务发送不带参数的通知,相当于计数型或二进制信号量。xTaskNotifyGive( xTaskToNotify )xTaskToNotify参数为任务句柄 TaskHandle_t类型,可以从xTaskCreate()创建任务获得,也可以xTaskGetCurrentTaskHandle()获取当前正在运行的任务句柄。对这个任务句柄的任务通知计数+1.uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickTy
u-boot学习笔记一--bootcmd和bootargs Print 打印环境变量tftp addr filename 将tftp服务器上的filename文件下载到addr这个地址Bootcmd三个命令 第一个下载zimage镜像到80800000,下载设备树到83000000,第三个命令启动linux bootz 传入参数 80800000 - 83000000 第二个参数不用用- 第一个kernel地址,第三个设备树地址bootcmd=tftp 80800000 zImage;tftp 83000000 imx6ull-alientek-nand.
linux启动流程学习 Linux启动第一阶段启动文件linux/arch/arm/kernel/head.SENTRY(stext):__vet_atags 校验设备树是否有效__create_page_tables创建页表ldr r13, =__mmap_switched 存入r13,使能mmu之后调用__enable_mmu->__turn_mmu_on->mov r3, r13 即调用__mmap_switched->start_kernel第二阶段 init/main.casmli
notify消息通知回调模块 #ifndef NOTIFY_H#define NOTIFY_H#include <stdint.h>typedef enum { RET_KEY, NOTIFY_MAX, } NotifyModule;typedef int32_t (*SyncCall)(int32_t event, const void *input, int32_t inLen, void *output, int32_t outLen);typedef int32_t (*Asyn
gpio子系统和pinctrl子系统学习 Imx6ul.dtsi 下找到iomuxc节点iomuxc: iomuxc@020e0000 { compatible = "fsl,imx6ul-iomuxc"; reg = <0x020e0000 0x4000>;};全局搜索字符串fsl,imx6ul-iomuxc,有个驱动文件里面写有pinctr 内容,gpio的配置读写,由soc厂商实现所以直接copy,Linux内核利用 compatible匹配来确定驱动通过 of.h下的节点驱动函数imx6ull-alientek-
Linux定时器jiffies学习 struct timer_list { struct list_head entry; /* 定时器链表 */ unsigned long expires; /* 启动定时长 */ struct tvec_base *base; void (*function)(unsigned long); /* 定时执行函数 */ unsigned long data; /* 传递给func的参数 */ int slack;};apivoid add_timer(struct timer_list
字符设备驱动一个驱动支持多个设备 一个驱动支持多个设备时有两种方式 一个cdev对象管理多个设备 每个cdev对象管理一个设备一套文件 如何区分呢,open函数传入参数来区分,一个struct inode代表一个真实的文件,struct file表示一个打开的文件static int key_open(struct inode *inode, struct file *filp){}struct inode { kdev_t i_dev; /* inode所在的device代码 */ umode_t i_mode; /*
openssl与mbedtls互相aes加密解密 上班访问外网限制,只能访问csdn,个人练习工程代码文件读取 1k字节解密加密 256bit cbc模式 mbedtls加密 openssl解密#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h&g
openssl非对称加密填充OAEP 上班访问外网限制,只能访问csdn,个人练习工程代码/* crypto/rsa/rsa_oaep.c */int RSA_padding_add_PKCS1_OAEP(unsigned char *to, int tlen, const unsigned char *from, int flen, const unsigned char *param, int plen){
单片机实现内存管理 #include <stdint.h>#define MEM_SIZE 1024 * 10#define MEM_UNUSED 0#define MEM_USED 1char memeryPool[MEM_SIZE] = {0};#pragma pack(1)struct MemBlock { struct MemBlock *next; uint32_t size; char *address; unsigned char state;};