娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年11月05日(星期二)

正在發(fā)生

2021年11月05日 | 一起學(xué)mini2440裸機(jī)開發(fā)(七)--UART高級(jí)實(shí)驗(yàn),可變參函數(shù)

發(fā)布者:獨(dú)行于世 來(lái)源: eefocus關(guān)鍵字:mini2440  裸機(jī)開發(fā)  UART 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

概述:

在C語(yǔ)言中,使用printf()進(jìn)行格式化輸出非常方便,例如,printf("%dn",a)可以將a的值以十進(jìn)制的格式輸出,然后換行。printff()函數(shù)的原型為:int printf(const char *format,...),在函數(shù)參數(shù)中的...表示可變參數(shù),即輸入?yún)?shù)的個(gè)數(shù)不確定(例如,printf("%dn",a)和printf("%d%dn",a,b)都可以使函數(shù)進(jìn)行正確的輸出),這種輸入?yún)?shù)不確定的函數(shù)就叫可變參數(shù)。在UART中能不能自己寫一個(gè)類似于 printf() 的函數(shù)(例如,Uart0_Printf("%d",a))呢?下面咱們就試圖找到實(shí)現(xiàn)這種函數(shù)的方法。


實(shí)驗(yàn)內(nèi)容:

本實(shí)驗(yàn)要實(shí)現(xiàn)的功能就是利用uart實(shí)現(xiàn)發(fā)送可變參數(shù)的功能。


實(shí)驗(yàn)代碼結(jié)構(gòu)如下圖:

實(shí)驗(yàn)一共包含3個(gè)文件:main.c  uart.c  uart.h


main.c文件內(nèi)容:


#include

#include"uart.h"


int main()

{   

    unsigned int a=10;       //系統(tǒng)時(shí)鐘初始化,F(xiàn)CLK=400MHz,HCLK=100MHz,PCLK=50MHz

    Uart0_Init(115200);      //初始化并設(shè)置波特率為115 200

    while(1)

    {

       Uart0_Printf("Uart0_Printf test output is:%dn",a);

    }     

}


uart.c文件內(nèi)容:


#include

#include

#include"uart.h"


#define PCLK   50000000

#define UART_BRD     (int)((PCLK/(baudrate*16))-1)


/***********************************************

*函數(shù)名稱:void Uart0_Init(unsigned int baudrate)

*參數(shù)說(shuō)明:baudrate:波特率

*返 回 值:無(wú)

*全局變量: 無(wú)

*功    能:對(duì)UART0進(jìn)行初始化                         

************************************************/

void Uart0_Init(unsigned int baudrate)

{

     GPHCON&=~((3<<4)|(3<<6));  //GPH2--TXD0;GPH3--RXD0

     GPHCON|=((2<<4)|(2<<6));    //設(shè)置GPH2、GPH3為TXD0、RXD0功能

     GPHUP=0x00;                 //上拉電阻使能

      ULCON0|=0x03;              //設(shè)置數(shù)據(jù)發(fā)送格式:8個(gè)數(shù)據(jù)位,1個(gè)停止位,無(wú)校驗(yàn)位

      UCON0=0x05;                //發(fā)送模式和接收模式都使用查詢模式

     UBRDIV0=UART_BRD;         //設(shè)置波特率,其中波特率作為一個(gè)參數(shù)傳遞到該初始化函數(shù)

     URXH0=0;          //將URXH0清零

}


/***********************************************

*函數(shù)名稱:void putc(unsigned char c)

*參數(shù)說(shuō)明:c:通過(guò)串口接收到的字符,注意這里是8位數(shù)據(jù)

*返 回 值:無(wú)

*全局變量: 無(wú)

*功    能:將通過(guò)串口接收到的字符發(fā)送給PC機(jī)并顯示在

*          串口調(diào)試工具。                

************************************************/

void putc(unsigned char c)

{

     UTXH0=c;

     while(!(UTRSTAT0&(1<<2)));    //等待發(fā)送完成

}


/***********************************************

*函數(shù)名稱:unsigned char getc(void)

*參數(shù)說(shuō)明:無(wú)

*返 回 值:c:通過(guò)串口接收到的字符,注意這里是8位數(shù)據(jù)

*全局變量: 無(wú)

*功    能:接收并保存通過(guò)串口輸入的數(shù)據(jù)                         

************************************************/

unsigned char getc(void)

{

     unsigned char c;

     while(!(UTRSTAT0&(1<<0)));     //查詢是否接收到有效數(shù)據(jù)

     c=URXH0;

     return c;

}

/***********************************************

*函數(shù)名稱:static void Uart0_SendByte(int data)

*參數(shù)說(shuō)明:data:一個(gè)字節(jié)的數(shù)據(jù)

*返 回 值:無(wú)

*全局變量: 無(wú)

*功    能:向串口發(fā)送一個(gè)字節(jié)的數(shù)據(jù)。這個(gè)函數(shù)只在本

*          C文件內(nèi)使用,不被其他文件所調(diào)用,故使用

*     static來(lái)修飾。                 

************************************************/


static void Uart0_SendByte(int data)

{

     if(data=='n')      //注意,在超級(jí)終端中使用的換行符是'r',因此當(dāng)遇到'n'時(shí)

    {                        //需要將其轉(zhuǎn)換為'r'

       while(!(UTRSTAT0&(1<<2)));    //等待發(fā)送完成

       UTXH0='r';  

    }

    while(!(UTRSTAT0&(1<<2)));    //等待發(fā)送完成完成后,將新發(fā)送

    UTXH0=data;                         //的數(shù)據(jù)寫入發(fā)送寄存器

}

/***********************************************

*函數(shù)名稱:static void Uart0_SendString(char *pt)

*參數(shù)說(shuō)明:pt:指針,指向?qū)⒁l(fā)送的數(shù)據(jù)所在數(shù)組的地址

*返 回 值:無(wú)

*全局變量: 無(wú)

*功    能:發(fā)送字符串                 

************************************************/

static void Uart0_SendString(char *pt)

{

   while(*pt)

   {

      Uart0_SendByte(*pt++); 

   }

}

/***********************************************

*函數(shù)名稱:void Uart0_Printf(const char *fmt,...)

*參數(shù)說(shuō)明:可變參數(shù)

*返 回 值:無(wú)

*全局變量: 無(wú)

*功    能:將()的內(nèi)容通過(guò)串口發(fā)送并在PC機(jī)顯示                

************************************************/

void Uart0_Printf(const char *fmt,...)

{

   va_list ap;                   //定義了一個(gè)指向可變參數(shù)列表指針

   char string[50];          //存儲(chǔ)要發(fā)送的內(nèi)容


   va_start(ap,fmt);     //是參數(shù)列表指針ap指向函數(shù)參數(shù)列表中的第一個(gè)可變參數(shù)

   vsprintf(string,fmt,ap);

   va_end(ap);              //清空參數(shù)列表

   Uart0_SendString(string);   //將該緩沖區(qū)中的數(shù)據(jù)打印到串口中

}


 


    下面重點(diǎn)講解一下Uart0_Printf(const char *fmt,...)


   void Uart0_Printf(const char *fmt,...)

   {

       va_list ap;                  //定義了一個(gè)指向可變參數(shù)列表指針

       char string[50];         //存儲(chǔ)要發(fā)送的內(nèi)容


       va_start(ap,fmt);     //是參數(shù)列表指針ap指向函數(shù)參數(shù)列表中的第一個(gè)可變參數(shù)

       vsprintf(string,fmt,ap);

       va_end(ap);             //清空參數(shù)列表

       Uart0_SendString(string);  //將該緩沖區(qū)中的數(shù)據(jù)打印到串口中

  }


理解這個(gè)函數(shù)需要了解下面的基礎(chǔ)知識(shí):


可變參數(shù)的列表分為兩部分:固定參數(shù)和個(gè)數(shù)可變的可變參數(shù)。函數(shù)中至少有一個(gè)固定參數(shù);可變參數(shù)由于個(gè)數(shù)不確定,聲明用"..."表示。


   ●   va_list  ap:定義了一個(gè)指向可變參數(shù)列表指針。


   ●   va_start(ap,argN):使參數(shù)列表指針ap指向函數(shù)列表中的第一個(gè)可變參數(shù),argN是最后一個(gè)固定參數(shù)。例如,當(dāng)函數(shù)的聲明是void va_test(char a,char b,...),則它的固定參數(shù)依次是a,b,最后一個(gè)固定參數(shù)argN為c,因此就是a_start(ap,c)。


   ●   va_end(ap):清空參數(shù)列表,并置參數(shù)指針ap無(wú)效,該宏的作用是結(jié)束可變參數(shù)的獲取。


   ●   vsprintf()函數(shù)原型為int vsprintf(char *string,char *format,va_list param),其作用是將param按格式format寫入字符串string中。


因此,上述函數(shù)的基本流程是:


   ●  先開辟一塊區(qū)域存儲(chǔ)可變參數(shù)


   ●  然后,調(diào)用vsprintf()函數(shù)將可變參數(shù)按照指定的格式復(fù)制到緩沖區(qū)中。


   ●  最后,調(diào)用Uart0_SendString()函數(shù)將該緩沖區(qū)中的數(shù)據(jù)打印到串口中。 


將以上3個(gè)文件,復(fù)制完后,再編譯調(diào)試后,可以看到串口的效果:

我將該工程文檔上傳到:可自行下載點(diǎn)擊打開鏈接


注意:老生長(zhǎng)談


     ①將S3C2440.s中的CLOCK_SETUP     EQU     0 修改為  CLOCK_SETUP     EQU     1


     ②復(fù)制并修改Ext_RAM文件。

關(guān)鍵字:mini2440  裸機(jī)開發(fā)  UART 引用地址:一起學(xué)mini2440裸機(jī)開發(fā)(七)--UART高級(jí)實(shí)驗(yàn),可變參函數(shù)

上一篇:一起學(xué)mini2440裸機(jī)開發(fā)(九)--ARM中斷控制系統(tǒng)
下一篇:一起學(xué)mini2440裸機(jī)開發(fā)(四)--S3C2440定時(shí)器學(xué)習(xí)

推薦閱讀

  充電樁是固定在地面上為電動(dòng)汽車提供直流/交流電的充電裝置,并具備相應(yīng)的顯示、刷卡、計(jì)費(fèi)以及打印充電信息等功能。近些年,國(guó)際車企齊轉(zhuǎn)向電動(dòng)汽車以及國(guó)內(nèi)電動(dòng)車銷售的高位增速,表明汽車電動(dòng)化已經(jīng)是不可逆轉(zhuǎn)的趨勢(shì),電動(dòng)車行業(yè)已進(jìn)入的高速成長(zhǎng)期。但在我國(guó),電動(dòng)車相配套的充電樁建設(shè)速度仍落后于電動(dòng)汽車保有量的增長(zhǎng),電動(dòng)車保有量/公共充電...
日前,Achronix聯(lián)合BittWare宣布推出全新的、面向高性能計(jì)算和數(shù)據(jù)加速應(yīng)用的FPGA加速卡。新推出的VectorPath S7t-VG6加速卡搭載了Achronix采用7nm工藝打造的Speedster 7tAC7t1500獨(dú)立FPGA芯片,它在同類PCIe FPGA加速卡中,提供了目前業(yè)界最高性能的接口。這些高性能接口包括1x400GbE和2x100GbE接口,以及總帶寬為4Tbps的8組GDDR6的板上存儲(chǔ)器,使該加...
“我對(duì)車機(jī)系統(tǒng)的唯一要求,就是要有CarPlay。”類似的話語(yǔ),在三五年前的消費(fèi)者選購(gòu)新車時(shí)并不鮮見。在那個(gè)車聯(lián)網(wǎng)并不發(fā)達(dá)、車機(jī)體驗(yàn)取決于車輛出廠時(shí)內(nèi)置了多少本地?cái)?shù)據(jù)的年代里,將手中的蘋果手機(jī)插在車上,就可以享受到導(dǎo)航、音樂(lè)、Siri語(yǔ)音助手等服務(wù),已經(jīng)能夠吊打一眾的原廠車機(jī)。基于這樣的消費(fèi)認(rèn)知,車企往往也會(huì)將內(nèi)置CarPlay作為營(yíng)銷賣點(diǎn)之一。...
在6月份的WWDC大會(huì)之前,一份蘋果公司的招聘信息中提到了“homeOS”,這引起了人們的興趣,認(rèn)為蘋果公司將在大會(huì)上宣布一些重要的基于家庭的操作系統(tǒng)。  雖然這種情況沒(méi)有實(shí)現(xiàn),但“homeOS”,一個(gè)迄今為止從未聽說(shuō)過(guò)的蘋果操作系統(tǒng),繼續(xù)出現(xiàn)在公司的招聘信息中。  10月12日發(fā)布的Apple Music團(tuán)隊(duì)的一個(gè)類似的iOS工程職位,包括6月份的招聘信...

史海拾趣

問(wèn)答坊 | AI 解惑

淺析利用PLC組態(tài)軟件消除干擾的方法

摘要:隨著科學(xué)技術(shù)的發(fā)展,可編程序控制器PLC在工業(yè)控制中 的廣泛應(yīng)用,它的可靠性直接關(guān)系到工業(yè)企業(yè)的安全生產(chǎn)和經(jīng)濟(jì)運(yùn)行.而PLC控制系統(tǒng)的抵抗干擾的能力是整個(gè)生產(chǎn)系統(tǒng)可靠運(yùn)行的關(guān)鍵.目前,各種類型的可編 程序控制器PLC一般集中安裝在集控室或是 ...…

查看全部問(wèn)答∨

uboot怎么引導(dǎo)內(nèi)核

之前編譯uboot通過(guò)了才發(fā)現(xiàn)是交叉編譯器出現(xiàn)問(wèn)題還好算是過(guò)去,開始引導(dǎo)內(nèi)核了。看了一下uboot的代碼沒(méi)有關(guān)于nand flash分區(qū)的信息,不知道該把內(nèi)核映像下載到哪里。想問(wèn)一下 uboot是不是沒(méi)有分區(qū)信息嗎,我用的是1.2.0的上面沒(méi)有mtdparts的命令不 ...…

查看全部問(wèn)答∨

4511譯碼器 中的一些問(wèn)題!

最近做了一個(gè)搶答器的設(shè)計(jì),但中間有些問(wèn)題弄不明白啊!知道咱們論壇里的高手多,特此來(lái)請(qǐng)教! 4511 后面需要連接一個(gè)七段顯示器,這兩個(gè)之間應(yīng)該需要一個(gè)電阻的吧?需要一個(gè)多大的電阻呢? 4511連接的七段顯示器能夠顯示0~9 ,但我只需要1~8 , ...…

查看全部問(wèn)答∨

第一次測(cè)試串口通訊問(wèn)題.有好些疑問(wèn)

# include <reg51.h> # define BYTE unsigned char # define WORD unsigned int BYTE idata txdata[7]={"ABCDEF"}; sbit  P15=P1^5 ;//蜂鳴器 void main() {    BYTE h;    WORD k;     ...…

查看全部問(wèn)答∨

ce驅(qū)動(dòng)怎么測(cè)試

我現(xiàn)在的Boot loader和NK.bin都是現(xiàn)成的,可以改嗎?如果要測(cè)試驅(qū)動(dòng),是不是要重新定制系統(tǒng)啊,是不是Boot loader和BSP都要自己寫啊? 請(qǐng)問(wèn)有沒(méi)有這方面的資料或書籍,謝謝!…

查看全部問(wèn)答∨

各位高手請(qǐng)幫我看看這段代碼哪里也問(wèn)題?

我想將一個(gè)數(shù)組寫入str710內(nèi)部Flash的B1F0扇區(qū),結(jié)果老是出錯(cuò),不知道哪里有問(wèn)題?請(qǐng)各位高手幫我看看哪里有問(wèn)題,一下是寫Flash函數(shù):Write_Flash(buff,0x400C0000,10,FLASH_B1F0);void Write_Flash(u32 *buff,u32 Addr,u16  ...…

查看全部問(wèn)答∨

請(qǐng)問(wèn)下,STM32檢測(cè)繼電器的狀態(tài)

想請(qǐng)問(wèn)下,繼電器的閉合或者斷開,怎么檢測(cè)? 是不是類似檢測(cè)鍵盤是否按下那種方法? GPIO接到繼電器的一端,繼電器另外一端接地;GPIO寫1,然后再讀回來(lái);如果是閉合的,則讀回來(lái)的是0;如果是斷開的則讀回來(lái)的仍然是1?…

查看全部問(wèn)答∨

隨談

      原來(lái)沒(méi)有接觸過(guò)觸摸板,正好借此機(jī)會(huì)體驗(yàn)一下觸摸板和低功耗。因?yàn)闆](méi)有之前也沒(méi)有用過(guò)430的單片機(jī),所以也沒(méi)啥心得,發(fā)帖就為能夠爭(zhēng)取個(gè)    TI MSP-EXP430FR5739實(shí)驗(yàn)板套件  430單片機(jī)到手后主 ...…

查看全部問(wèn)答∨

拒絕忽悠 移動(dòng)GPU全解讀(二)

本帖最后由 jameswangsynnex 于 2015-3-3 20:02 編輯 說(shuō)說(shuō)被忽略的Shader接下來(lái)我們回到Shader。Shader是GPU里負(fù)責(zé)計(jì)算的主要部分,同時(shí)占得面積最大,耗電也最多。當(dāng)今的桌面GPU往往都不再談三角形生成率,或是像素填充率了,給的指標(biāo)都是Shader ...…

查看全部問(wèn)答∨

電腦監(jiān)控儀

電腦監(jiān)測(cè)儀主要是為了保護(hù)電腦用戶的眼鏡。現(xiàn)在人們的生活越來(lái)越離不開電腦,比如那些整天坐在電腦前做軟件開發(fā),研發(fā)工作,或其他工作的人,電腦對(duì)他們眼鏡的傷害可想而知。所以為了保護(hù)廣大電腦用戶的眼鏡,希望能開發(fā)出一種產(chǎn)品來(lái)給電腦用戶帶來(lái) ...…

查看全部問(wèn)答∨
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 蒙阴县| 天水市| 涞水县| 双牌县| 西乌珠穆沁旗| 尚义县| 樟树市| 新河县| 元朗区| 城口县| 康保县| 高州市| 陵川县| 水城县| 平阳县| 达孜县| 天峨县| 大洼县| 东方市| 平遥县| 南岸区| 塔城市| 栾川县| 武川县| 长岛县| 景泰县| 道真| 招远市| 福泉市| 洮南市| 北海市| 台东市| 垦利县| 隆昌县| 伽师县| 额济纳旗| 合川市| 沙田区| 牙克石市| 榆树市| 会昌县|