從0開始學linux韋東山教程Linux驅動入門實驗班(6)

??本人從0開始學習linux,使用的是韋東山的教程,在跟著課程學習的情況下的所遇到的問題的總結,理論雖枯燥但是是基礎。本人將前幾章的內容大致學完之后,考慮到后續驅動方面得更多的開始實操,后續的內容將以韋東山教程Linux驅動入門實驗班的內容為主,學習其中的代碼并手敲。做到鍛煉動手能力的同時鉆研其中的理論知識點。
摘要:這篇文檔主要介紹的是步進電機的控制,其實步進電機就是引腳的高低電平控制,所以沒有特別深入的內容,此章節較短。
摘要關鍵詞:步進電機驅動

本文詳細介紹以下問題,如果你遇到了以下問題,看看我的方案能否解決。

步進電機

1.引腳配置

1.原理圖參考引腳設置

1.引腳對應原理圖
由于本人沒有買他的拓展板,只好看原理圖來找引腳的分布,然后發現原理圖對不上只能看封裝圖。
在這里插入圖片描述
想著確定圖片中紅色框的引腳位置,找半天沒找著j5,說實在的原理圖畫的有點不好。
在這里插入圖片描述
這部分也是自己采購的模塊,使用的引腳和它一樣的,使用的是GPIO4_19、20、21、22。
其實這個章節沒有什么很難的地方,就是輸入高低電平控制引腳。

在這里插入圖片描述
本人使用的步進電機驅動模塊如圖所示。IN1,IN2,IN3,IN4也就是連接對應的GPIO引腳。步進電機有防呆接口直接連接就行。注意跳帽不用拔。
輸入以下命令行即可。

make clean
bear make
ctrl+h
arm-buildroot-linux-gnueabihf-gcc  編譯設置
make
adb push gpio_drv.ko button_test root

越到后面代碼沒有啥好講解的了,更多的是引腳功能配置和邏輯了

驅動代碼

#include <linux/module.h>
#include <linux/poll.h>#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/kernel.h>
#include <linux/major.h>
#include <linux/mutex.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/stat.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/tty.h>
#include <linux/kmod.h>
#include <linux/gfp.h>
#include <linux/gpio/consumer.h>
#include <linux/platform_device.h>
#include <linux/of_gpio.h>
#include <linux/of_irq.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/slab.h>
#include <linux/fcntl.h>
#include <linux/timer.h>
#include <linux/delay.h>
struct gpio_desc{int gpio;char *name;} ;static struct gpio_desc gpios[] = {{115, "motor_gpio0", },{116, "motor_gpio1", },{117, "motor_gpio2", },{118, "motor_gpio3", },
};/* 主設備號                                                                 */
static int major = 0;
static struct class *gpio_class;/* int buf[2];
*  buf[0] = 步進的次數,》0:逆時針;《 0:順時針
*  buf[1] = mdelay的時間
*/
// 馬達引腳設置數組
static int g_motor_pin_ctrl[8] = {0x2,0x3,0x1,0x9,0x8,0xc,0x4,0x6};
static int g_motor_index = 0;void set_pin_for_motor(int index)
{int i ;for(i = 0;i < 4;i++){gpio_set_value(gpios[i].gpio,g_motor_pin_ctrl[index] & (1<<i) ? 1:0);}
}
static ssize_t motor_drv_write(struct file *file, const char __user *buf, size_t size, loff_t *offset)
{int ker_buf[2];int err;int step;if (size != 8)return -EINVAL;err = copy_from_user(ker_buf, buf, size);if (ker_buf[0] > 0){/*逆時針旋轉*/for(step = 0;step<ker_buf[0];step++){set_pin_for_motor(g_motor_index);mdelay(ker_buf[1]);g_motor_index--;if(g_motor_index == -1)g_motor_index = 7 ;}}else{ker_buf[0] = 0 - ker_buf[0];/*順時針旋轉*/for(step = 0;step<ker_buf[0];step++){set_pin_for_motor(g_motor_index);mdelay(ker_buf[1]);g_motor_index ++;if(g_motor_index == 8)g_motor_index = 0 ;}}return 2;    
}/* 定義自己的file_operations結構體                                              */
static struct file_operations gpio_key_drv = {.owner	 = THIS_MODULE,.write   = motor_drv_write,};/* 在入口函數 */
static int __init motor_drv_init(void)
{int err;int i;int count = sizeof(gpios)/sizeof(gpios[0]);printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);for (i = 0; i < count; i++){		err = gpio_request(gpios[i].gpio,gpios[i].name);gpio_direction_output(gpios[i].gpio,0);}/* 注冊file_operations 	*/major = register_chrdev(0, "100ask_gpio_key", &gpio_key_drv);  /* /dev/gpio_desc */gpio_class = class_create(THIS_MODULE, "100ask_gpio_key_class");if (IS_ERR(gpio_class)) {printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);unregister_chrdev(major, "100ask_gpio_key");return PTR_ERR(gpio_class);}device_create(gpio_class, NULL, MKDEV(major, 0), NULL, "motor"); /* /dev/motor */return err;
}/* 有入口函數就應該有出口函數:卸載驅動程序時,就會去調用這個出口函數*/
static void __exit motor_drv_exit(void)
{int i;int count = sizeof(gpios)/sizeof(gpios[0]);printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);device_destroy(gpio_class, MKDEV(major, 0));class_destroy(gpio_class);unregister_chrdev(major, "100ask_gpio_key");for (i = 0; i < count; i++){gpio_free(gpios[i].gpio);}
}/* 7. 其他完善:提供設備信息,自動創建設備節點                                     */module_init(motor_drv_init);
module_exit(motor_drv_exit);MODULE_LICENSE("GPL");

應用程序代碼


#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <poll.h>
#include <signal.h>
#include <stdlib.h>static int fd;/** ./button_test /dev/motor -100  1**/
int main(int argc, char **argv)
{int buf[2];int ret;/* 1. 判斷參數 */if (argc != 4) {printf("Usage: %s <dev> <step_number> <mdelay_number>\n", argv[0]);return -1;}/* 2. 打開文件 */fd = open(argv[1], O_RDWR | O_NONBLOCK);if (fd == -1){printf("can not open file %s\n", argv[1]);return -1;}buf[0] = strtol(argv[2], NULL, 0);buf[1] = strtol(argv[3], NULL, 0);ret = write(fd, buf, 8);close(fd);return 0;
}
rmmod gpio_drv.ko
[root@100ask:~]# insmod gpio_drv.ko
[root@100ask:~]# ./button_test /dev/motor 100 1 
[root@100ask:~]# ./button_test /dev/motor 100 1 
[root@100ask:~]# ./button_test /dev/motor 100 1

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/90925.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/90925.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/90925.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

高性能反向代理與負載均衡 HAProxy 與 Nginx

在現代高并發 Web 架構中&#xff0c;HAProxy 和 Nginx 是兩個非常重要的工具。它們在反向代理、負載均衡、SSL 終止、緩存、限流等方面發揮著關鍵作用。 一、HAProxy 與 Nginx 簡介 1. HAProxy 簡介 HAProxy&#xff08;High Availability Proxy&#xff09; 是一個使用 C …

AI安全“面壁計劃”:我們如何對抗算法時代的“智子”封鎖?

> 在算法窺視一切的今天,人類需要一場數字世界的“面壁計劃” 2025年,某醫院部署的AI分診系統被發現存在嚴重偏見:當輸入相同癥狀時,系統為白人患者分配急診通道的概率是黑人患者的**1.7倍**。調查發現,訓練數據中少數族裔樣本不足**15%**,導致AI在“認知”上形成了結…

數據庫數據恢復—報錯“system01.dbf需要更多的恢復來保持一致性”的Oracle數據恢復案例

Oracle數據庫故障&#xff1a; 某公司一臺服務器上部署Oracle數據庫。服務器意外斷電導致數據庫報錯&#xff0c;報錯內容為“system01.dbf需要更多的恢復來保持一致性”。該Oracle數據庫沒有備份&#xff0c;僅有一些斷斷續續的歸檔日志。Oracle數據庫恢復流程&#xff1a; 1、…

Spring Cloud Gateway 服務網關

Spring Cloud Gateway是 Spring Cloud 生態系統中的一個 API 網關服務&#xff0c;用于替換由Zuul開發的網關服務&#xff0c;基于Spring 5.0Spring Boot 2.0WebFlux等技術開發&#xff0c;提供了網關的基本功能&#xff0c;例如安全、監控、埋點和限流等&#xff0c;旨在為微服…

[數據結構]#6 樹

樹是一種非線性的數據結構&#xff0c;它由節點組成&#xff0c;并且這些節點之間通過邊連接。樹的每個節點可以有一個或多個子節點&#xff0c;并且有一個特殊的節點叫做根節點&#xff08;沒有父節點&#xff09;。樹在計算機科學中應用廣泛&#xff0c;尤其是在數據庫索引、…

車輛網絡安全規定之R155與ISO/SAE 21434

隨著科技的不斷進步&#xff0c;車輛已經從傳統的機械裝置演變為高度智能化的移動終端。現代汽車不僅配備了先進的駕駛輔助系統&#xff08;ADAS&#xff09;、車載信息娛樂系統&#xff08;IVI&#xff09;&#xff0c;還具備聯網功能&#xff0c;能夠實現遠程診斷、自動駕駛、…

Go語言實戰案例-合并多個文本文件為一個

以下是《Go語言100個實戰案例》中的 文件與IO操作篇 - 案例21&#xff1a;合并多個文本文件為一個 的完整內容&#xff0c;適用于初學者學習文件讀取與寫入的綜合運用。&#x1f3af; 案例目標使用 Go 語言將指定目錄下的多個 .txt 文件&#xff0c;合并成一個新的總文件。&…

基坑滲壓數據不準?選對滲壓計能實現自動化精準監測嗎?

一、滲壓監測的背景 滲壓計是一種專門用于測量構筑物內部孔隙水壓力或滲透壓力的傳感器&#xff0c;適用于長期埋設在水工結構物或其它混凝土結構物及土體內&#xff0c;以測量結構物或土體內部的滲透&#xff08;孔隙&#xff09;水壓力。 在水利工程中&#xff0c;大壩、水庫…

Linux網絡:阿里云輕量級應用服務器配置防火墻模板開放端口

1.問題介紹在使用Udp協議或其他協議進行兩臺主機或同一臺主機通信時&#xff0c;常常會出現bind成功&#xff0c;但是在客戶端向服務端發送數據后&#xff0c;服務端無響應的情況&#xff0c;如果使用輕量級應用服務器&#xff0c;大概率是服務器的端口因為防火墻未對公網IP開放…

《 Spring Boot整合多數據源:分庫業務的標準做法》

&#x1f680; Spring Boot整合多數據源&#xff1a;分庫業務的標準做法 文章目錄&#x1f680; Spring Boot整合多數據源&#xff1a;分庫業務的標準做法&#x1f50d; 一、為什么需要多數據源支持&#xff1f;&#x1f4a1; 典型業務場景?? 二、多數據源集成方案對比&#…

前端ApplePay支付-H5全流程實戰指南

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔前言近期公司開展關于蘋果支付的相關業務&#xff0c;與之前不同的是&#xff0c;以前后臺直接獲取第三方Wallet封裝好的接口獲取支付地址&#xff0c;H5頁面直接跳轉使用Appl…

Flink窗口:解鎖流計算的秘密武器

Flink 窗口初識在大數據的世界里&#xff0c;數據源源不斷地產生&#xff0c;形成了所謂的 “無限數據流”。想象一下&#xff0c;網絡流量監控中&#xff0c;每一秒都有海量的數據包在網絡中穿梭&#xff0c;這些數據構成了一個無始無終的流。對于這樣的無限數據流&#xff0c…

Java排序算法之<希爾排序>

目錄 1、希爾排序介紹 1.1、定義 1.2、核心思想 2、希爾排序的流程 第 1 輪&#xff1a;gap 4 第 2 輪&#xff1a;gap 2 第 3 輪&#xff1a;gap 1 3、希爾排序的實現 4、時間復雜度分析 5、希爾排序的優缺點 6、適用場景 前言 希爾排序&#xff08;Shell Sort&…

c++加載qml文件

這里展示了c加載qml文件的三種方式以及qml文件中根節點的訪問準備在創建工程的初期&#xff0c;遇到了一個問題&#xff0c;cmake文件以前都是系統自動生成的&#xff0c;不需要我做過多的操作修改&#xff0c;但是&#xff0c;加載qml的程序主函數是需要用到QGuiApplication&a…

007TG洞察:GPT-5前瞻與AI時代競爭力構建:技術挑戰與落地路徑

最近&#xff0c;GPT-5 即將發布的消息刷爆了科技圈&#xff0c;更讓人期待的是&#xff0c;GPT-6 已經悄悄啟動訓練了&#xff0c;OpenAI 的奧特曼表示對未來1-2年的模型充滿信心&#xff0c;預測AI將進化為能夠發現新知識的“AI科學家”。面對日益強大的通用AI&#xff0c;企…

Windows下編譯OpenVDB

本文記錄在Windows下編譯OpenVDB的流程。 零、環境 操作系統Windows 11VS Code1.92.1Git2.34.1MSYS2msys2-x86_64-20240507Visual StudioVisual Studio Community 2022CMake3.22.1 一、編譯 1.1 下載 git clone https://github.com/AcademySoftwareFoundation/openvdb.git …

react 內置hooks 詳細使用場景,使用案例

useState場景&#xff1a;組件中管理局部狀態&#xff0c;如表單值、開關、計數器等。const [count, setCount] useState(0); return <button onClick{() > setCount(count 1)}>Click {count}</button>;useEffect 場景&#xff1a;組件掛載時執行副作用&#…

從0到1學Pandas(九):Pandas 高級數據結構與操作

目錄一、探秘多級索引1.1 創建多級索引1.2 多級索引操作1.3 索引轉換二、探索 Panel 與 xarray2.1 Panel 數據結構2.2 xarray 庫2.3 高維數據操作三、時間序列高級應用3.1 時區處理3.2 時間序列重采樣與頻率轉換3.3 時間序列分解與預測四、數據透視與重塑高級技巧4.1 復雜透視表…

C# 圖像轉換實戰:Bitmap 轉 BitmapSource 的 2 種方法

C# 圖像轉換實戰:Bitmap 轉 BitmapSource 的 2 種方法 引言 兩種轉換方法的完整實現 1. 基于GDI句柄的直接轉換 (ToBitmapSourceFast) 2. 基于內存流的編碼轉換 (ToBitmapSourceSafe) 方法對比與選型指南 避坑指南 GDI句柄泄漏問題 圖像顯示不完整 多線程訪問圖像引發異常 不同…

Spring Boot 整合 Spring MVC:自動配置與擴展實踐

Spring MVC 作為 Java Web 開發的核心框架&#xff0c;在傳統 SSM 項目中需要大量 XML 配置&#xff08;如 DispatcherServlet、視圖解析器等&#xff09;。而 Spring Boot 通過 "自動配置" 特性&#xff0c;簡化了 Spring MVC 的整合過程&#xff0c;同時保留了靈活…