發表文章

stm32 設定 pwm

圖片
 stm32cubeMX 選用 stm32f103c8t6 目標 PWM 選擇 Timer1, Channel 2 系統 Clock 使用 8MHz 使用 pwm 輸出1kHz波形 設定流程 1. 左邊欄欄位 Timers 選 TIM1 2. 中間 TIM1 Mode and Configuration, Mode Clock Source 選擇 Internal Clock Channel 2 選擇 PWM Generation CH2 3. 中間下方 Parameter Settings Counter Setting 選項 prescaler 設定 7 Counter Period(AutoReload Register) 設定 999 auto-reload preload 設定 Enable PWM Generation Channel 2 選項 Mode 選 PWM mode 1 Pulse 設定 500 在 RCC的部份沒有啟用 HSC 外部 oscillator,  所以此處 Fsys是 8 MHz, 設定 PWM參數, PSC = 7, ARR = 999, Pulse = 500, Fpwm = Fsys/(Arr+1)*(Psc+1), 得 Fpwm為 1kHz. Pulse 為 500, 占空比為 500/(999+1) = 50 % Timer 1 Ch2 輸出為 PA10腳位

stm32 uart 導向至 printf

讓stm32 可以使用 printf 輸出 stm32cubeMX安裝的套件包路徑 repository/stm32cube_fw-fw_v1.8.5/projects/stm32f103rb-nucleo/example/uart/uart_printf 可以找到範例   #ifdef __GNUC__      #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else      #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ PUTCHAR_PROTOTYPE {      HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);      return ch; } 還要記得加入 syscalls.c 到 core/src/  路徑底下 修改 makefile C_SOURCES 加入 Core/Src/syscalls.c

jiffies用法

  jiffies用法 jiffies定義在 (引入 會自動引入此檔)。Jiffies為Linux核心變數,它被用來紀錄系統自開幾以來,已經過多少的tick。Tick是HZ的倒數,意即timer interrupt每發生一次中斷的時間。 如HZ為250時,tick為4毫秒(millisecond)。 範例: #include<linux/jiffies.h> unsigned long j ,stamp_1,stamp_half,stamp_n; j = jiffies /* 讀取當時的時戳 */  stamp_1 = j + HZ; /* 1秒之後 */  stamp_half = j + HZ/2; /* 半秒之後 */  stamp_n = j + n*HZ /1000 /* n毫秒之後 */ #include<linux/jiffies.h> int time_after(unsigned long a,unsigned long b); int time_before(unsigned long a,unsigned long b); int time_after_eq(unsigned long a,unsigned long b); int time_before_eq(unsigned long a,unsigned long b);

pthread priority

Linux核心的三種排程策略: 1,SCHED_OTHER 分時排程策略, 2,SCHED_FIFO實時排程策略,先到先服務。一旦佔用cpu則一直執行。一直執行直到有更高優先順序任務到達或自己放棄 3,SCHED_RR實時排程策略,時間片輪轉。當程序的時間片用完,系統將重新分配時間片,並置於就緒佇列尾。放在佇列尾保證了所有具有相同優先順序的RR任務的排程公平 int main() { int i; i = getuid(); if(i==0)      printf("The current user is root\n"); else      printf("The current user is not root\n"); pthread_t ppid1; struct sched_param param; pthread_attr_t attr2; pthread_attr_init(&attr2); param.sched_priority = 51; pthread_attr_setschedpolicy(&attr2,SCHED_RR); pthread_attr_setschedparam(&attr2,&param); pthread_attr_setinheritsched(&attr2,PTHREAD_EXPLICIT_SCHED);//要使優先順序其作用必須要有這句話 pthread_create(&ppid1,&attr2,(void *)Thread1,NULL); pthread_join(ppid1,NULL); pthread_attr_destroy(&attr2); return 0; }

sysfs_create_group 註冊 attribute

參考kx122.c 中 sysfs 註冊 device_attribute  kx122_sysfs_get_enable 實作成 _show() kx122_sysfs_set_enable 實作成 _store() static struct device_attribute dev_attr_accel_enable = __ATTR(enable,      S_IRUGO | S_IWUSR,      kx122_sysfs_get_enable,      kx122_sysfs_set_enable); static struct device_attribute dev_attr_accel_delay = __ATTR(delay,      S_IRUGO | S_IWUSR,      kx122_sysfs_get_delay,      kx122_sysfs_set_delay); static struct device_attribute dev_attr_reg_read = __ATTR(reg_read,      S_IWUSR,      NULL,      kx122_sysfs_reg_read); static struct device_attribute dev_attr_reg_write = __ATTR(reg_write,      S_IWUSR,      NULL,      kx122_sysfs_reg_write); static struct attribute *kx122_sysfs_attrs[] = {      &dev_attr_accel_enable.attr,      &dev_attr_acce...

Linux-DEVICE_ATTR()參考

圖片
  1.介绍 使用 DEVICE_ATTR ,可以实现驱动在sys目录自动创建文件,我们只需要实现show和store函数即可. 然后在应用层就能通过cat和echo命令来对sys创建出来的文件进行读写驱动设备,实现交互. 2.DEVICE_ATTR()宏定义 DEVICE_ATTR() 定义位于include/linux/device.h中,定义如下所示: #define DEVICE_ATTR(_name, _mode, _show, _store) \ struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store) 以下面DEVICE_ATTR()定义为例: static ssize_t show_my_device( struct device * dev, struct device_attribute *attr, char *buf) // cat命令时,将会调用该函数 { return buf; } static ssize_t set_my_device( struct device * dev, struct device_attribute * attr, const char *buf, size_t len) // echo命令时,将会调用该函数. { return len; } static DEVICE_ATTR(my_device_test, S_IWUSR|S_IRUSR, show_my_device, set_my_device); // 定义一个名字为my_device_test的设备属性文件 最终将宏展开为: struct device_attribute dev_attr_my_device_test = { .attr = {.name = " my_device_test " , .mode = S_IWUSR| S_IRUSR }, .show = show_my_device, ...

i2c bus 通訊異常

  I2C bus 是 WIRE AND I2C bus上連接的裝置 SDA和SCL線路都是設定open drain。藉由pull high電阻拉高電位,實現線與。 i2c bus上只要其中一個裝置,拉LOW SDA或SCL,其他裝置就無法拉HIGH,如果有裝置拉LOW以後沒有release回idle high,整個 bus的通訊會被暫停,稱 I2C bus hangs 問題如果出在i2c master 端藉由除錯可以知道,主動去重置i2c周邊功能。但i2c slave不一定有reset pin,如果 slave hang住bus, 即使系統reset也不能解除,須將slave重新上電。 SDA hang. master 通訊中如果意外中斷,沒有發出完整的CLK。卡在SCL為HIGH, SDA被slave拉LOW。此時master無法發起START條件,沒辦法開始下次與slave通訊。 可以藉由gpio對SLC拉pluse使slave的狀態往下走。直到SDA被釋放,master可以發出STOP條件。結束這次錯誤通訊。 SCL hang. Clock Stretching. slave在接收資料來不及處理時,主動拉low SCL 直到 slave ready 釋放SCL。 SCL被咬住通常是程序設計問題, ISR狀態出錯或卡死。