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

歷史上的今天

今天是:2025年05月31日(星期六)

2018年05月31日 | STM8L的printf函數實現

發布者:小牛隊 來源: eefocus關鍵字:STM8L  printf函數 手機看文章 掃描二維碼
隨時隨地手機看文章

串口通信單片機學習的一個最基本、最重要的功能之一。串口可以間接的當做調試接口使用,實現單片機與電腦之間的通信。還可以與一些模塊(比如藍牙、wifi)通信,也可以作為和其他單片機通信的工具。作為開發者,熟悉串口是必須的。

=========================================== 
STM8L的USART特性: 
這里寫圖片描述

我們在使用串口的時候,主要關心:波特率、停止位、奇偶校驗位。 
再次就是怎樣接收、發送數據。常用:阻塞式發送數據、中斷方式接收數據。

========================================== 
在單片機的調試過程中經常會要適時地輸出變量的值,這時printf函數是一個非常好的選擇;對于一般的單片機只有串口可以與外界進行通信,所以我們需要將printf函數重定向到串口。 
如何實現重定向c庫函數printf到USART1函數? 
不管printf函數多么復雜,最終調用的是purchar函數,所以我們只要重新定義putchar函數即可。

========================================== 
使用到的庫如下: 

這里寫圖片描述

外設在使用前,都必須使能對應的外設時鐘。為了cpu的低功耗,板子上默認的外設都是關閉的,否則板子一上電所有的外設都啟動了功耗相對就高了,因此我們在使用的時候,用到哪一個外設就開啟使能哪一個外設的時鐘。

usart.h:

#ifndef __USART_H

#define __USART_H


#include "stm8l15x.h"


#define BAUDRATE 115200

#define SIZE 128


/*定義一個結構體,存放串口相關變量*/

typedef struct uart_rxbuf_s

{

  uint8_t               buf[SIZE];  /* 串口接收數據的buffer*/

  uint32_t              len;      /* 數據的長度 */

}uart_rxbuf_t;


extern uart_rxbuf_t  g_uart_rxbuf;  /*定義一個結構體變量g_uart_rxbuf,會用以訪問結構體里的成員*/


extern void uart_init(void);  /*串口初始化函數聲明*/

extern void uart_send(char *buf, int len);/*串口發送函數聲明*/

extern int uart_getchar(void);/*接收*/


#endif


void uart_init(void)

{

  /*buffer先清零*/

  memset(&g_uart_rxbuf, 0, sizeof(g_uart_rxbuf));

  /*使能usart時鐘*/

  CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);

  /*TXD */

  GPIO_Init(GPIOC, GPIO_Pin_2, GPIO_Mode_Out_PP_High_Fast);

  /*RXD*/

  GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_In_PU_No_IT);

  /*復位*/

  USART_DeInit(USART1);


  /*配置串口*/

  USART_Init(USART1, BAUDRATE, USART_WordLength_8b, USART_StopBits_1, USART_Parity_No, 

             (USART_Mode_TypeDef)(USART_Mode_Tx | USART_Mode_Rx));


  /*開啟總中斷,也可以放到main.c里*/

  enableInterrupts();

  /*開啟接收中斷*/

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

  /*打開串口*/

  USART_Cmd(USART1, ENABLE);


  USART_SendData8(USART1, '\r');

  /*用于檢查串口UART1是否發送完成,完成時,TC中斷標志置位,退出輪詢等待*/

  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);


}


/*系統printf函數實現*/

int putchar(int c)

{

  if('\n' == (char)c)

  {

    USART_SendData8(USART1, '\r');

    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);

  }

  USART_SendData8(USART1, c);

  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);


  return (c);

}


void uart_send(char *buf, int len)

{

  int i;

  /*把要發送的數據放入緩沖區,然后將緩沖區的數據發送到寄存器DR*/

  for(i=0; i

  {

    USART1->DR = (unsigned char)buf[i];

    /*用于檢查串口UART1是否發送完成,完成時,TC中斷標志置位,退出輪詢等待*/

    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);  

  }

}


int uart_getchar(void)

{

  int c;


  /* 循環,直到讀取數據寄存器標志被設置 */

  while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);  

  c = USART_ReceiveData8(USART1); 


  /* 返回接收的數據 */

   USART_SendData8(USART1, c); 

   while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);    


  return (c);   

}

時鐘配置: 

sysclock.h:


#ifndef __SYSCLOCK_H

#define __SYSCLOCK_H


#include "stm8l15x.h"


void sys_clk_init();


#endif


sysclock.c:


#include "sysclock.h"

#include "stm8l15x_clk.h"

void sys_clk_init(void)

{

  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);/*高速內部時鐘分頻器:1  =>即16M*/

  /*選擇高速外部時鐘信號作為系統時鐘源*/

  CLK_SYSCLKSourceSwitchCmd(ENABLE);

  CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSE);


  while (CLK_GetSYSCLKSource() != CLK_SYSCLKSource_HSE)

  {}

}


發送數據不需要中斷,但是接收數據需要利用中斷來處理,這樣效率比較高,我們只需要填充stm8l15x_it.c里的代碼。這個是中斷程序的源文件,在編寫應用的過程中,需要根據需求改動,以便在自己的程序中使用中斷功能。 

部分代碼:


/**

  * @brief USART1 RX / Timer5 Capture/Compare Interrupt routine.

  * @param  None

  * @retval None

  */

INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler, 28)

{

/* 緩沖區是否已滿,滿的話就丟棄 */

  if(g_uart_rxbuf.len>=sizeof(g_uart_rxbuf.buf))

  {

     USART_ReceiveData8(USART1); /* 丟掉 */

     return ;

  }


  g_uart_rxbuf.buf[g_uart_rxbuf.len++] = USART_ReceiveData8(USART1); /*接收數據*/

}


main.c: 

這里只做了簡單的printf打?。?/p>


#include "stm8l15x.h"

#include "usart.h"

#include "sysclock.h"

#include "stdio.h"



int main( void )

{

  sys_clk_init();

  uart_init();


  uart_send("abc", 3);

  int i;

  for(i=0; i<5; i++)

  {

    printf("\ntest,test\n");

  }

  printf("\ntest finshed!\n");


  return 0;

}


測試結果: 
這里寫圖片描述 
若有什么功能要在主函數的while(1)做的,可以再實現,這里只是測試一下printf,所以沒有寫while。

總結: 
程序從main.c進入 
1、引腳初始化; 
2、時鐘初始化; 
3、配置芯片的UART模塊; 
4、若有串口數據進來,會觸發中斷函數,執行中斷,把接收到的數據取出來,再通過發送函數發送出去;


關鍵字:STM8L  printf函數 引用地址:STM8L的printf函數實現

上一篇:stm8——串口printf的實現
下一篇:IAR開發環境使用串口printf輸出(基于STM8L15x系列單片機)

推薦閱讀

根據市場調研機構Gartner的統計數據,2018年第一季度全球智能手機銷量達3.84億部,與去年同期相比增長了1.3%,這意味著持續低迷的智能手機市場開始恢復增長?! ∪呛吞O果依舊占據了智能手機市場份額的前兩位,三星以7856萬部手機銷量占據20.5%,比去年同期略微下降?! artner?認為盡管三星的旗艦機Galaxy S9?比S8當年更早推出,但是三星2018年的增...
5月23日消息,通用汽車公司在本周一公布了全新一代汽車電子架構,該電子架構基于超高速以太網打造,信息處理速度高達每小時4.5TB,約為目前處理速度的5倍,這種高速處理能力,使通用汽車未來的新車將具備整車OTA功能,也讓通用汽車成為第一批具備這種能力的大型國際車企。通用方面表示,新一代電子架構將率先搭載于今年推出的2020款凱迪拉克CT5上,預計在2...
協作機器人夾爪制造商OnRobot推出2.5D視覺系統Eyes,適用于各家先進機器手臂,提供外加的深度感知和零件辨識功能。 據報導,機器手臂經常遇到的難題,就是無法拾放大小、形狀或擺放方向不一的物品,通常需要外加夾具、送料盤等其它硬件協助作業,但也因此增加作業成本和復雜度,局限了設備的應用范圍。 OnRobot新推出的2.5D視覺系統Eyes,只要照一張...
馬來西亞疫情再起,大馬政府斷然祭出為期兩周的封城措施,要求當地產線維持低度人力運作,產線降載,沖擊被動元件產能供應,美商AVX、臺商旺詮、華新科,以及日商松下、村田在當地均布建產能,包含車用MLCC、晶片電阻、固態電容、鋁質電容均在受沖擊之列。業界分析,國巨、大毅可望迎接轉單效應,尤其美商AVX雖是全球第二大鉭電廠,但是該公司的大馬檳城廠...

史海拾趣

小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 武乡县| 东至县| 宁乡县| 佳木斯市| 巴塘县| 广东省| 许昌市| 周宁县| 拉萨市| 忻州市| 东乡| 南江县| 综艺| 依安县| 永平县| 文安县| 磐安县| 白河县| 靖安县| 绥宁县| 赤水市| 玉溪市| 尖扎县| 简阳市| 阜宁县| 扎兰屯市| 木兰县| 图们市| 周宁县| 浮山县| 阜康市| 特克斯县| 磐安县| 舟曲县| 铜川市| 府谷县| 东丽区| 万盛区| 汪清县| 砚山县| 扎兰屯市|