12.11

1.q,w,e亮led1,2,3;

? ? a,s,d滅led1,2,3;

main.c

#include "uar1.h"#include "led.h"void delay(int ms){int i,j;for(i=0;i<ms;i++){for(j=0;j<2000;j++);}}int main(){//1.串口的初始化uart4_init();//LED初始化all_led_init();char a;//現象是發送一個a串口工具打印一個bwhile(1){//2.從串口讀取一個字符a=mygetchar();//3.將讀取到的字符+1發送回去myputchar(a);switch (a){case 'q': led1_on();break;case 'w': led2_on();break;case 'e': led3_on();break;case 'a': led1_off();break;case 's': led2_off();break;case 'd': led3_off(); break;   }}return 0;}

led.h

#ifndef __LED_H__
#define __LED_H__typedef struct
{unsigned int moder;unsigned int otyper;unsigned int ospeedr;unsigned int pupdr;unsigned int idr;unsigned int odr;unsigned int bsrr;
} gpio_t1;#define GPIOE1 ((gpio_t1 *)0X50006000)
#define GPIOF1 ((gpio_t1 *)0X50007000)
#define RCC_MP_AHB4ENSETR (*(unsigned int *)0X50000a28)
void all_led_init();
void led1_on();
void led2_on();
void led3_on();
void led1_off();
void led2_off();
void led3_off();#endif

uar1.h

#ifndef __UART_H__
#define __UART_H__
#include"stm32mp1xx_gpio.h"
#include"stm32mp1xx_rcc.h"
#include"stm32mp1xx_uart.h"
void uart4_init();
void myputchar(char i);
char mygetchar();
#endif

led.c

#include "led.h"
void all_led_init()
{// 1.使能外設時鐘RCC_MP_AHB4ENSETR |= (0x3 << 4);// 2.設置PF10 PE10 PE8為輸出輸出GPIOE1->moder &= (~(0x3 << 20));GPIOE1->moder |= (0x1 << 20);GPIOF1->moder &= (~(0x3 << 20));GPIOF1->moder |= (0x1 << 20);GPIOE1->moder &= (~(0x3 << 16));GPIOE1->moder |= (0x1 << 16);// 3.設置推挽輸出GPIOE1->otyper &= (~(0x1 << 10));GPIOF1->otyper &= (~(0x1 << 10));GPIOE1->otyper &= (~(0x1 << 8));// 4.設置輸出速度為低速GPIOE1->ospeedr &= (~(0x3 << 20));GPIOF1->ospeedr &= (~(0x3 << 20));GPIOE1->ospeedr &= (~(0x3 << 16));// 5.設置無上拉下拉GPIOE1->pupdr &= (~(0x3 << 20));GPIOF1->pupdr &= (~(0x3 << 20));GPIOE1->pupdr &= (~(0x3 << 16));
}void led1_on()
{GPIOE1->odr |= (0x1 << 10);
}
void led2_on()
{GPIOF1->odr |= (0x1 << 10);
}
void led3_on()
{GPIOE1->odr |= (0x1 << 8);
}void led1_off()
{GPIOE1->odr &= (~(0x1 << 10));
}
void led2_off()
{GPIOF1->odr &= (~(0x1 << 10));
}
void led3_off()
{GPIOE1->odr &= (~(0x1 << 8));
}

uar1.c

#include"uar1.h"//串口數據初始化
void uart4_init()
{//設置UART4的RCc時鐘使能//RCC_MP_APB1ENSETR[16]->1RCC->MP_APB1ENSETR |= (0x1<<16);//設置GPIOB和GPIOG的時鐘使能//RCC_MP_AHB4ENSETR[6]->1//RCC_MP_AHB4ENSETR[1]->1RCC->MP_AHB4ENSETR |= (0x1<<1);RCC->MP_AHB4ENSETR |= (0X1<<6);//設置PG11和PB2功能復用為UART4功能//PG11//GPIOG_MODER[23:22]->10GPIOG->MODER &= (~(0X3<<22));GPIOG->MODER |= (0X2<<22);//GPIOG_AFRH[15:12]->0110    GPIOG->AFRH &= (~(0xf<<12));GPIOG->AFRH |= (0x6<<12);//PB2//GPIOB_MODER[5:4]->10//GPIOB_AFRL[11:8]->1000GPIOB->MODER &= (~(0x3<<4));GPIOB->MODER |= (0X2<<4);GPIOB->AFRL &= (~(0xF<<8));GPIOB->AFRL |= (0x8<<8);//禁用串口USART4->CR1 &=(~0x1);//設置數據8個數據位 CR1[28]->0  CR1[12]-》0USART4->CR1 &= (~(0X1<<28));USART4->CR1 &= (~(0X1<<12));//設置沒有校驗位CR1[10]->0USART4->CR1 &= (~(0X1<<10));//設置1個停止位CR2[13:12]->00USART4->CR2 &= (~(0x3<<12));//設置16倍采樣 CR1[15]->0USART4->CR1 &= (~(0X1<<15));//設置波特率為115200 BRR=0X22BUSART4->BRR |= 0X22B;//設置1分頻 PRESC[3:0]->0000USART4->PRESC &= (~(0XF));//使能發送器 CR1[3]->1USART4->CR1 |= (0X1<<3);//使能接收器 CR1[2]->1USART4->CR1 |= (0X1<<2);//使能串口 CR1[0]->1USART4->CR1 |= (0X1);
}
//封裝函數發送一個字符數據
void myputchar(char c)
{//判斷發送數據寄存器有沒有數據,沒有數據時可以發送while(!(USART4->ISR&(0X1<<7)));USART4->TDR=c;//將要發送的數據保存在發送寄存器中while(!(USART4->ISR&(0X1<<6)));//數據傳輸完成,函數結束
}
char mygetchar()
{char c;//判斷是否有數據準備好while(!(USART4->ISR&(0X1<<5)));//數據傳輸完成,函數結束c=USART4->RDR;return c;}

2.字符串點亮

uar1.c

#include"uar1.h"
#include"led.h"
char buf[51]={0};
//串口數據初始化
void uart4_init()
{//設置UART4的RCc時鐘使能//RCC_MP_APB1ENSETR[16]->1RCC->MP_APB1ENSETR |= (0x1<<16);//設置GPIOB和GPIOG的時鐘使能//RCC_MP_AHB4ENSETR[6]->1//RCC_MP_AHB4ENSETR[1]->1RCC->MP_AHB4ENSETR |= (0x1<<1);RCC->MP_AHB4ENSETR |= (0X1<<6);//設置PG11和PB2功能復用為UART4功能//PG11//GPIOG_MODER[23:22]->10GPIOG->MODER &= (~(0X3<<22));GPIOG->MODER |= (0X2<<22);//GPIOG_AFRH[15:12]->0110    GPIOG->AFRH &= (~(0xf<<12));GPIOG->AFRH |= (0x6<<12);//PB2//GPIOB_MODER[5:4]->10//GPIOB_AFRL[11:8]->1000GPIOB->MODER &= (~(0x3<<4));GPIOB->MODER |= (0X2<<4);GPIOB->AFRL &= (~(0xF<<8));GPIOB->AFRL |= (0x8<<8);//禁用串口USART4->CR1 &=(~0x1);//設置數據8個數據位 CR1[28]->0  CR1[12]-》0USART4->CR1 &= (~(0X1<<28));USART4->CR1 &= (~(0X1<<12));//設置沒有校驗位CR1[10]->0USART4->CR1 &= (~(0X1<<10));//設置1個停止位CR2[13:12]->00USART4->CR2 &= (~(0x3<<12));//設置16倍采樣 CR1[15]->0USART4->CR1 &= (~(0X1<<15));//設置波特率為115200 BRR=0X22BUSART4->BRR |= 0X22B;//設置1分頻 PRESC[3:0]->0000USART4->PRESC &= (~(0XF));//使能發送器 CR1[3]->1USART4->CR1 |= (0X1<<3);//使能接收器 CR1[2]->1USART4->CR1 |= (0X1<<2);//使能串口 CR1[0]->1USART4->CR1 |= (0X1);
}
//封裝函數發送一個字符數據
void myputchar(char c)
{//判斷發送數據寄存器有沒有數據,沒有數據時可以發送while(!(USART4->ISR&(0X1<<7)));USART4->TDR=c;//將要發送的數據保存在發送寄存器中while(!(USART4->ISR&(0X1<<6)));//數據傳輸完成,函數結束
}
char mygetchar()
{char c;//判斷是否有數據準備好while(!(USART4->ISR&(0X1<<5)));//數據傳輸完成,函數結束c=USART4->RDR;return c;}//輸出一個字符串
void puts(char *s)
{while(*s){myputchar(*s);s++;}myputchar('\n');//切換到下一行myputchar('\r');//切換到一行的開頭
}//讀取一個字符串
char *gets()
{unsigned int i;for(i=0;i<50;i++){buf[i]=mygetchar();//接受字符串myputchar(buf[i]);//回顯if(buf[i]=='\r')break;}buf[i]='\0';myputchar('\n');//換行return buf;
}
//字符串比較
int strcmp(char *str,char *dst)
{while(*str){if(*str != *dst){return 1;}   str++;dst++;          }return 0;
}
void deal(char*str)
{if(strcmp(str,"led1_on")==0){led1_on();}else if(strcmp(str,"led1_off")==0){led1_off();}else if(strcmp(str,"led2_on")==0){led2_on();}else if(strcmp(str,"led2_off")==0){led2_off();}else if(strcmp(str,"led3_on")==0){led3_on();}else if(strcmp(str,"led3_off")==0){led3_off();}
}

?main.c

#include "uar1.h"#include "led.h"void delay(int ms){int i,j;for(i=0;i<ms;i++){for(j=0;j<2000;j++);}}int main(){all_led_init();//1.串口的初始化uart4_init();char a;char *str;//現象是發送一個a串口工具打印一個bwhile(1){myputchar('\n');//切換到下一行myputchar('\r');//切換到一行的開頭//2.從串口讀取一個字符//a=mygetchar();//3.將讀取到的字符+1發送回去//myputchar(a+1);str=gets();// puts(str);deal(str);}return 0;}

?

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

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

相關文章

「CocoaPods」Podfile文件模板

前言&#xff1a;在iOS項目中&#xff0c;通常會使用到CocoaPods作為一個第三方庫的依賴管理工具&#xff0c;可以簡化對組件的依賴、更新的過程&#xff0c;本文將介紹在iOS項目中多Target企業級項目的Podfile文件編寫格式 一、podfile介紹 先簡單介紹一下podfile文件&#…

基于mdadm創建與管理軟raid

環境 VMware workstation 17pro CentOS Linux release 7.9.2009 (Core) ——內存8G&#xff0c;16core ——硬盤系統盤100G ——四塊20G硬盤 注意事項 1、在沒有操作系統的情況下&#xff0c;可以在裝系統時將磁盤做軟raid&#xff0c;然后使用軟raid作為系統盤 2、在重構時&a…

虛幻商城 道具匯總

文章目錄 載具Vehicle Variety Pack(車輛品種包)Vehicle Variety Pack Volume 2(車輛品種包第 2 卷)家具Free Furniture Pack(免費家具包)Old West - VOL 1 - Interior Furniture(舊西部 - 第1卷 - 家具包)Old West VOL.3 - Travel Supplies and Goods(舊西部 - 第3卷…

容器及容器調度(云)

在云計算中&#xff0c;容器是一種輕量級、可執行的軟件包&#xff0c;它包含應用程序及其全部依賴項&#xff0c;包括庫、二進制文件、配置文件等。容器與虛擬機不同&#xff0c;因為它們不需要包含完整的操作系統&#xff1b;相反&#xff0c;所有容器都共享主機操作系統的內…

SQL中的三值邏輯:TRUE、FALSE 和 UNKNOWN。

在SQL中&#xff0c;通常采用三值邏輯處理條件表達式的真值。這種邏輯是基于三種可能的真值狀態&#xff1a;TRUE、FALSE 和 UNKNOWN。 TRUE&#xff08;真&#xff09;&#xff1a; 表示條件為真或成立。 FALSE&#xff08;假&#xff09;&#xff1a; 表示條件為假或不成立。…

7 Linux 內核移植

一、編譯 ST 的 Linux 系統 1. 壓縮源碼 首先先下載 ST 官方源碼&#xff0c;之前章節已經下載過了&#xff0c;直接輸入以下命令&#xff1a; cd linux/atk-mpl/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.4.31-r0/ 然…

【Python】np.hstack()和np.vstack函數詳解和示例

本文通過函數原理和運行示例&#xff0c;對np.hstack()和np.vstack函數進行詳解&#xff0c;以幫助大家理解和使用。 更多Numpy函數詳解和示例&#xff0c;可參考 【Python】Numpy庫近50個常用函數詳解和示例&#xff0c;可作為工具手冊使用 目錄 np.hstack()函數解析運行示例…

EasyExcel使用模板導出復雜Excel

1&#xff09;添加easyexlce的依賴 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.0-beta1</version> </dependency>2&#xff09;添加excel模板文件 實現的效果&#xff1a;…

打包less

接HTML和css之后對less進行打包 1.在之前的文件夾里的src文件夾創建一個less文件 2.打開webpack——>中文文檔——>Loader——>less—loader 3.復制下圖代碼到終端 4.復制下圖內容到webpack.config.js腳本 5.在src里的js文件年引入less文件 6.在終端運行 npm run te…

助力工業生產質檢,基于輕量級yolov5-seg開發構建工業場景下滾珠絲杠傳動表面缺陷分割檢測系統

AI賦能工業生產是一個強有力的方式&#xff0c;在我們之前的系列博文中也有很多相應的開發實踐&#xff0c;感興趣的胡都可以自行移步閱讀&#xff0c;本文的核心思想就是想要基于輕量級的實例分割模型來開發構建工業場景下的滾珠絲杠傳動表面缺陷分割檢測系統&#xff0c;首先…

STM32-固件打包部署

STM32-固件打包部署 Fang XS.1452512966qq.com STM32固件輸出 工程上使用Keil開發STM32軟件&#xff1b;在調試過程中&#xff0c;可直接編譯下載&#xff1b;例如bootloader和APP&#xff0c;在調試時&#xff0c;可以直接下載2次&#xff1b;但是工程上&#xff0c;需要大…

力扣經典面試題——合并區間

合并區間 https://leetcode.cn/problems/merge-intervals/description/?envTypestudy-plan-v2&envIdtop-interview-150 這題思維量一般但比較考察API的使用。 1、數組的自定義排序 2、數組的初始化定義 3、Arrays轉int 通過重寫Comparator的compare方法來自定義排序規則…

nvm動態管理node.js

nvm 安裝 nvm介紹 &#xff08;1&#xff09;nvm(Node.js version manager) 是一個命令行應用&#xff0c;可以協助您快速地 更新、安裝、使用、卸載 本機的全局 node.js 版本。 &#xff08;2&#xff09;有時候&#xff0c;我們可能同時在進行多個項目開發&#xff0c;而多…

Spring Boot監聽redis過期的key

Redis支持過期監聽&#xff0c;可以實現監聽過期數據&#xff0c;實現過程如下 1、pom依賴 <!-- Redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></depend…

Django講課筆記02:Django環境搭建

文章目錄 一、學習目標二、相關概念&#xff08;一&#xff09;Python&#xff08;二&#xff09;Django 三、環境搭建&#xff08;一&#xff09;安裝Python1. 從官方網站下載最新版本的Python2. 運行安裝程序并按照安裝向導進行操作3. 勾選添加到路徑復選框4. 完成安裝過程5.…

【計算機網絡】UDP報文詳解

目錄 一. UDP協議概述 二. UDP報文格式 首部 三. UDP的緩沖區 一. UDP協議概述 UDP——用戶數據報協議&#xff0c;是傳輸層的一個重要協議 基于UDP的應用層協議有&#xff1a;DNS&#xff0c;TFTP&#xff0c;SNMP&#xff0c;NTP 協議全稱默認端口號DNSDomain Name Se…

開源框架Apache NiFi調研

開源框架Apache NiFi調研 NiFi背景介紹一、什么是NiFi1.1 Apache NiFi特點&#xff1a;流管理、易用性、安全性、可擴展的體系結構和靈活的伸縮模型。1.2 Apache NiFi特性1.2 Apache NiFi核心概念1.3架構 二、NiFi的誕生&#xff0c;要致力于解決的問題有哪些&#xff1f;三、為…

SQL 存儲過程觸發器

單個SQL語句 實現不了復雜的實際應用&#xff0c;需要一組SQL語句來實現&#xff0c;創建函數&#xff0c;以方便應用。 存儲過程 可編程的函數&#xff0c;完成特定功能編寫的SQL語句&控制語句的預編譯的集合&#xff0c;再次調用時不再編譯。 優點&#xff1a; 允許標…

軟件開發經常出現的bug原因有哪些

軟件開發中出現bug的原因是多方面的&#xff0c;這些原因可能涉及到開發流程、人為因素、設計問題以及其他一系列因素。以下是一些常見的導致bug的原因&#xff1a; 1. 錯誤的需求分析&#xff1a; 不正確、不完整或者模糊的需求分析可能導致開發人員誤解客戶的需求&#xff0…

AICore 帶來了 Android 專屬的 AI 能力,它要解決什么?采用什么架構思路?

前言 Google 最近發布的 Gemini 模型在全球引起了巨大反響&#xff0c;其在多模態領域的 Video demo 無比震撼。對于 Android 開發者而言&#xff0c;其中最振奮人心的消息莫過于 Gemini Nano 模型將內置到 Android 系統當中&#xff0c;并開放給開發者使用。 事實上&#xf…