STM32呼叫C庫自帶函式

weixin_33670713發表於2018-05-08

在MDK5的安裝路徑中:D:\MDK5\ARM\ARMCC\include,可以看到很多C庫標頭檔案,在程式中只要包含了相應的標頭檔案,編譯器就會自動把相應的程式碼編譯連結進去。

5755028-9aa2035f1ba1a244.png

下面介紹在STM32可能會用到的函式:

include "math.h"
1、 三角函式

double sin(double);正弦
double cos(double);餘弦
double tan(double);正切

2、指數與對數

double frexp(double value,int *exp);這是一個將value值拆分成小數部分f和(以2為底的)指數部分exp,並返回小數部分f,即f*2^exp。其中f取值在0.5~1.0範圍或者0。
double ldexp(double x,int exp);這個函式剛好跟上面那個frexp函式功能相反,它的返回值是x*2^exp
double modf(double value,double *iptr);拆分value值,返回它的小數部分,iptr指向整數部分。
double log (double); 以e為底的對數
double log10 (double);以10為底的對數
double pow(double x,double y);計算x的y次冪
float powf(float x,float y); 功能與pow一致,只是輸入與輸出皆為浮點數
double exp (double);求取自然數e的冪
double sqrt (double);開平方

3 、取整

double ceil (double); 取上整,返回不比x小的最小整數
double floor (double); 取下整,返回不比x大的最大整數

4 、絕對值

int abs(int i); 求整型的絕對值
double fabs (double);求實型的絕對值
double cabs(struct complex znum);求複數的絕對值

5 、取整與取餘,用/和%可代替

double modf (double,double*); 將引數的整數部分通過指標回傳,返回小數部分
double fmod (double,double); 返回兩引數相除的餘數

include "stdio.h"

主要就是printf函式在串列埠上的應用:
以正點原子的程式模版為例:

5755028-18ddacff17ce1d41.png

usart.c中定義了把printf和串列埠一輸出相關聯的函式:

//加入以下程式碼,支援printf函式,而不需要選擇use MicroLIB    
#if 1
#pragma import(__use_no_semihosting)             
//標準庫需要的支援函式                 
struct __FILE 
{ 
    int handle; 
}; 

FILE __stdout;       
//定義_sys_exit()以避免使用半主機模式    
void _sys_exit(int x) 
{ 
    x = x; 
} 
//重定義fputc函式 
int fputc(int ch, FILE *f)
{   
    while((USART1->SR&0X40)==0);//迴圈傳送,直到傳送完畢   
    USART1->DR = (u8) ch;      
    return ch;
}
#endif
如果你註釋掉這段話,但程式上使用了 printf,雖然軟體編譯不會報錯,但是硬體上 STM32 是無法啟動的,這段程式碼最好不要去修改。

若要對映到其他串列埠,只要把上訴的USART1改為USARTX或UARTX(X表示其他串列埠號)
通過%d,%f,就可以通過輸出變數值。
sprintf函式!!(非常靈活好用):

int sprintf( char *buffer, const char *format [, argument] ... );
//把整數123列印成一個字串儲存在s中。
sprintf(s, "%d", 123); //產生"123"
整數拼接。可以指定寬度,不足的左邊補空格:
sprintf(s, "%8d%8d", 123, 4567); //產生:" 123 4567"
當然也可以左對齊:
sprintf(s, "%-8d%8d", 123, 4567); //產生:"123 4567"
也可以按照16 進位制列印:
sprintf(s, "%8x", 4567); //小寫16 進位制,寬度佔8 個位置,右對齊

還可以字串拼接等等
u8 *p;
u8 res;
p=mymalloc(SRAMIN,40);//申請40位元組記憶體,SRAMIN表示內部記憶體池
sprintf((char*)p,"AT+CIPSTART=\"TCP\",\"%s\",%s",WEATHER_SERVERIP,WEATHER_PORTNUM);    //配置目標TCP伺服器
res = atk_8266_send_cmd(p,"OK",200);//連線到目標TCP伺服器
...
...
...
myfree(SRAMIN,p);//務必釋放記憶體,防止記憶體洩露無法回收

這裡記憶體申請很有用,有時候不申請時會亂碼!

include "stdlib.h"
//返回整數變元num的絕對值
int abs(int num);  

//返回長整形num的絕對值。
long labs(long int num);

//把str指向的串轉換為雙精度浮點值,串中必須含合法的浮點數,否則返回值不確定。
//串中的數可以由有效浮點數中的任何字元結束,如空白符、除句號外的標點符號和E或e之外的字元等。
double atof(const char *str);

//把str指向的串轉換為整數(int)值。串中必須含合法整型數,否則返回值無定義。
//串中的整數內容可由任何不是該整數的一部分的字元終止,如空白符、標點符號和字元等。
int atoi(const char *str);

//把str指向的串轉換為長整數(long int)值。串中必須含合法整型數,否則返回值無定義。
//串中的整數內容可由任何不是該整數的一部分的字元終止,如空白符、標點符號和字元等。
long atol(const char *str);

//產生偽隨機數序列,每次它被呼叫時返回一個0到RAND_MAX間的整數。RAND_MAX值至少是32767。
int rand(void);

//為rand()生成的偽隨機數序列設定起點。
void srand(unsigned int seed);
void* calloc (size_t, size_t); //分配記憶體, 並清零
void* malloc (size_t); //分配記憶體
void* realloc (void*, size_t); //重新分配記憶體, 返回新指標
void free (void*); //釋放記憶體

rand和srand函式用法:https://blog.csdn.net/xiaoxiongli/article/details/1667215

相關文章