chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

stm32f4ZG 和 cc2530f256的移植教程

科技綠洲 ? 來源:一起學(xué)嵌入式 ? 作者:一起學(xué)嵌入式 ? 2023-06-22 11:47 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌入式中printf 這種功能強(qiáng)大的函數(shù)可謂是c語言庫(kù)函數(shù)的中的一股清流!也就是太好用了吧!今天分享的例程有 stm32f4ZG 和 cc2530f256,這個(gè)兩款芯片的移植例程和移植教程!相信你看完后也可以移植到別的芯片去!

  • 使用的keil版本為:5.21a
  • IAR for 8051 version 為 10.10.1

可能會(huì)因?yàn)橛行┌姹静煌渲镁吐杂兴煌?/p>

(f4)串口1:

圖片

(f4)串口2:

圖片

下面這個(gè)是TI 的cc2530(就先跑著寄存器版本的吧,協(xié)議棧里頭配置差不太多!):

圖片

為啥要移植呢!相信學(xué)過實(shí)時(shí)操作系統(tǒng)的都有所了解,有個(gè)叫互斥信號(hào)量的東西!就是為了防止同一時(shí)間內(nèi)有兩個(gè)寄存器(那十來個(gè)寄存器,不是指外設(shè)!)在訪問同一塊內(nèi)存!這個(gè)很嚴(yán)重的,可能會(huì)導(dǎo)致程序死機(jī),或者卡在了某個(gè)死循環(huán)里面!

我們所使用的 printf 就是首先通過 vsprinf 對(duì)我們傳進(jìn)來的參數(shù)進(jìn)行格式化,我們傳進(jìn)去多少數(shù)據(jù),他按照我們傳進(jìn)來的格式,格式化后統(tǒng)統(tǒng)存放在一個(gè)buf里,如果我們定義了重定向,它就會(huì)把這個(gè)buf發(fā)送至你要發(fā)送的地方!

想象一下,如果在某個(gè)系統(tǒng)中有一個(gè)線程在vsprintf里面運(yùn)行,突然有一個(gè)任務(wù)級(jí)別比他高的任務(wù)把它運(yùn)行的時(shí)間搶了過去!而任務(wù)優(yōu)先級(jí)高的任務(wù)也在printf里面使用了那個(gè)buf,那就會(huì)產(chǎn)生上述的問題!

那就意味著我們所使用的 printf 存在不安全問題!當(dāng)然我們?cè)谙到y(tǒng)中可以通過臨界保護(hù)區(qū)來處理,也可以通過信號(hào)量等等處理!

但是目前有一個(gè)線程安全的函數(shù),擺在你面前,就問你用不用?

那我們的上邊 printf_u1 它是怎么處理的呢?毫無疑問,看代碼就能知道,它是直接發(fā)送的,也就是說你傳進(jìn)來的每一個(gè)參數(shù)它都會(huì)順手就發(fā)送出去(當(dāng)然要看你配置),它的數(shù)據(jù)將不會(huì)存放在一個(gè) buf 里邊,在發(fā)送。這就是他給力的地方了!

keil移植printf

首先,我們到文章的末尾獲取到源代碼后,打開 keil 軟件, 點(diǎn)擊 project > Options for… 就能打開一下頁(yè)面:

圖片

點(diǎn)擊 C/C++,選擇c99標(biāo)準(zhǔn)。到此為止編譯器配置完畢!

下面來配置代碼部分,打開頭文件為printf.h:

圖片

1,添加這個(gè)兩個(gè)文件的路徑還有頭文件,如果不懂可以搜搜!

2,點(diǎn)擊圖片上面的printf_ 去它定義的地方,我們要做出一定的修改。

圖片

來到這里之后我們可以看到_vsprintf 這個(gè)代碼里面最復(fù)雜的就是這一串函數(shù)了!

//我們只需要關(guān)心第一個(gè)參數(shù)即可!它是一個(gè)函數(shù)指針
static int _vsnprintf(out_fct_type out, char* buffer, const size_t maxlen, const char* format, va_list va)
//指向了一個(gè)參數(shù)為下圖的函數(shù),返回值為void
typedef void (*out_fct_type)(char character, void* buffer, size_t idx, size_t maxlen);

我們只要修改這_putchar 里面的內(nèi)容即可。參數(shù)二是我加上去的為了區(qū)分不同的串口類型,有多少個(gè)串口就的寫多少個(gè)_out_char 這樣的函數(shù)(這個(gè)是我的方法):

static inline void _out_char(char character, void* buffer, size_t idx, size_t maxlen)
{
  (void)buffer; (void)idx; (void)maxlen;
  if (character) 
  {
    _putchar(character,1);
  }
}

上圖是串口1的。再來看看串口2的:

int printf_u2(const char* format, ...)
{
  va_list va;
  va_start(va, format);
  char buffer[1];
  const int ret = _vsnprintf(u2_out_char, buffer, (size_t)-1, format, va);
  va_end(va);
  return ret;
}
//注意vsprintf第一參數(shù)
static inline void u2_out_char(char character, void* buffer, size_t idx, size_t maxlen)
{
  (void)buffer; (void)idx; (void)maxlen;
  if (character) {
    _putchar(character,2);
  }
}

而_putchar 就是我們數(shù)據(jù)最終流向的地方了!我是這樣寫的。

void _putchar(char character,char sw)
{
  // send char to console etc.
  if(sw == 1)
  {
    while((USART1- >SR&0X40)==0);//循環(huán)發(fā)送,直到發(fā)送完畢
    USART1- >DR = (u8) character;
  }
  if(sw == 2)
  {
  while((USART2- >SR&0X40)==0);//循環(huán)發(fā)送,直到發(fā)送完畢
     USART2- >DR = (u8) character;
  }
  if(sw == 3)
  {
  while((USART3- >SR&0X40)==0);//循環(huán)發(fā)送,直到發(fā)送完畢
     USART3- >DR = (u8) character;
  }
}

這個(gè) USART3->DR 為stm32串口的寄存器!讀者可參照自己的芯片來配置!

簡(jiǎn)單就完了!

IAR 配置方法

首先添加文件:

圖片

我在這里起名字為 C_Library。然后在添加文件:

圖片

選擇 printf.c (反正就是添加這個(gè)文件,放到哪里看你自己):

圖片

接著就是添加編譯器頭文件路徑:

圖片

圖片

在選擇第一個(gè)大框框右邊的那個(gè):

圖片

點(diǎn)擊Click to add。選擇頭文件路徑所在的文件夾后 select,接著就會(huì)回到這里:

圖片

上面是配置頭文件路徑的,第一個(gè)是絕對(duì)路徑,也就是說你工程文件移動(dòng)了,就回到不到了,第二個(gè)是相對(duì)路徑!選第二個(gè)吧!

接著編譯就會(huì)發(fā)現(xiàn)報(bào)錯(cuò)了?。?!

不要慌!我們首先選擇Options > General Options:

圖片

此時(shí)在編譯一次,就會(huì)發(fā)現(xiàn)也還是錯(cuò)了!說什么沒定義。

經(jīng)研究,哦,原來是stdint.h這個(gè)頭文件在for 8051 這款工具上,沒有定義64為的無符號(hào)整形,那個(gè)怎么辦?。?/p>

經(jīng)發(fā)現(xiàn),哦 ,原來注釋這個(gè)宏就行!

圖片

程序編譯通過!printf_u0 和stm32 配置類型,無非就是修改一下數(shù)據(jù)的流向!讀者自己研究一下吧??!

圖片

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2293

    文章

    11032

    瀏覽量

    365135
  • 移植
    +關(guān)注

    關(guān)注

    1

    文章

    401

    瀏覽量

    28702
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4381

    瀏覽量

    64924
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    CC2530F128使用ZStack需要修改哪些?

    ZStack-CC2530-2.5.1a中的例程都是針對(duì)CC2530F256的么?我現(xiàn)在用的板子是F128的,需要怎么改呢?我編譯了一下SimpleApp的協(xié)調(diào)器版本,得到如下圖所示結(jié)果,代碼量
    發(fā)表于 02-23 14:33

    CC2530F256RHAR 無線收發(fā)器芯片

    結(jié)合了領(lǐng)先的RF 收發(fā)器的優(yōu)良性能,業(yè)界標(biāo)準(zhǔn)的增強(qiáng)型8051 CPU,系統(tǒng)內(nèi)可編程閃存,8-KB RAM 和許多其他強(qiáng)大的功能。CC2530 有不同的閃存版本:CC2530F256/128,分別
    發(fā)表于 10-18 10:27

    關(guān)于CC2530F128使用ZStack需要哪些修改

    ZStack-CC2530-2.5.1a中的例程都是針對(duì)CC2530F256的么? ?我現(xiàn)在用的板子是F128的,需要怎么改呢? 我編譯了一下SimpleApp的協(xié)調(diào)器版本,得到如下圖所示結(jié)果,代碼
    發(fā)表于 06-21 12:10

    關(guān)于CC2530F256 的內(nèi)存分配問題

    各位大師:大家好!第一次發(fā)帖,請(qǐng)多多包涵。本人最近在做一個(gè)項(xiàng)目:利用CC2530F256芯片進(jìn)行開發(fā),其中要求功能之一為對(duì)射頻芯片的IEEE地址進(jìn)行軟件修改,即對(duì)flash的write操作;看了許多
    發(fā)表于 08-08 07:49

    請(qǐng)教關(guān)于CC2530F256芯片flash lock bits控制問題

    您好:我們?cè)谑褂?b class='flag-5'>CC2530F256芯片時(shí)候,將設(shè)備發(fā)到現(xiàn)場(chǎng)使用155臺(tái)有60臺(tái)出現(xiàn)flash被擦除而沒有寫入真實(shí)數(shù)據(jù),導(dǎo)致我們boot和app程序丟失無法正常運(yùn)行。該問題出現(xiàn)概率相當(dāng)高且導(dǎo)致項(xiàng)目
    發(fā)表于 08-10 06:44

    CC2530F256RHAR 無線收發(fā)器芯片

    結(jié)合了領(lǐng)先的RF 收發(fā)器的優(yōu)良性能,業(yè)界標(biāo)準(zhǔn)的增強(qiáng)型8051 CPU,系統(tǒng)內(nèi)可編程閃存,8-KB RAM 和許多其他強(qiáng)大的功能。CC2530 有不同的閃存版本:CC2530F256/128,分別
    發(fā)表于 02-15 17:27

    CC2530F256RHAR 無線收發(fā)器芯片

    結(jié)合了領(lǐng)先的RF 收發(fā)器的優(yōu)良性能,業(yè)界標(biāo)準(zhǔn)的增強(qiáng)型8051 CPU,系統(tǒng)內(nèi)可編程閃存,8-KB RAM 和許多其他強(qiáng)大的功能。CC2530 有不同的閃存版本:CC2530F256/128,分別
    發(fā)表于 03-23 11:04

    TI CC2530F256芯片無法程序控制flash加解鎖最后16字節(jié)的原因?

    您好: 我現(xiàn)在使用CC2530F256芯片,用TI專門的燒寫工具可以對(duì)flash加解鎖16字節(jié)進(jìn)行加解鎖操作。但是現(xiàn)在我想通過調(diào)用HalFlashWrite()函數(shù)軟件控制BANK7的page127
    發(fā)表于 08-10 08:14

    CC2530的相關(guān)資料推薦

    超低功耗要求的系統(tǒng)。運(yùn)行模式之間的轉(zhuǎn)換時(shí)間短進(jìn)一步確保了低能源消耗。CC2530F256 結(jié)合了德州儀器的業(yè)界
    發(fā)表于 12-10 08:25

    CC2530F256RHAR 無線收發(fā)器芯片 ZigBee 解決方案

    CC2530F256/128,分別具有 256/128KB 的閃存。具有不同的運(yùn)行模式,使得它尤其適應(yīng)超低功耗要求的系統(tǒng)。運(yùn)行模式之間的轉(zhuǎn)換時(shí)間短進(jìn)一步確保了低能源消耗。CC2530F256 結(jié)合了德州儀器
    發(fā)表于 10-11 15:07

    STM32F412ZG Datasheet

    STM32F412ZG Datasheet
    發(fā)表于 12-10 13:49 ?38次下載

    CC2530F32 CC2530F64 CC2530F128C產(chǎn)品資料英文版

    CC2530F32 CC2530F64 CC2530F128C產(chǎn)品資料英文版
    發(fā)表于 01-26 09:25 ?0次下載

    片上系統(tǒng)SoC芯片CC2530F256數(shù)據(jù)手冊(cè)

    8051 MCU的領(lǐng)先射頻收發(fā)器具有優(yōu)異的性能可編程閃存、8-KB RAM和許多其他強(qiáng)大功能。CC2530有四種不同的閃存版本:CC2530F32/64/128/256,分別具有32/64/128/
    發(fā)表于 07-21 15:32 ?3次下載

    CC2530F256RHAR Zigbee物聯(lián)網(wǎng)2.4G無線射頻收發(fā)RF芯片

    品牌;TI 型號(hào):CC2530F256RHAR 封裝:QFN-40 包裝;2500 CC2530F256RHAR 產(chǎn)品信息:296-24547-2-ND 制造商 Texas Instruments
    的頭像 發(fā)表于 11-15 13:02 ?3312次閱讀

    CC2530 芯片介紹

    源消耗。 CC2530F256 結(jié)合了德州儀器的業(yè)界領(lǐng)先的黃金單元ZigBee 協(xié)議棧(Z-Stack?),提供了一個(gè)強(qiáng)大和完整的ZigBee 解決方案。 CC2530F64 結(jié)合了德州
    發(fā)表于 01-03 11:00 ?4524次閱讀