0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

stm32f4ZG 和 cc2530f256的移植教程

科技绿洲 来源:一起学嵌入式 作者:一起学嵌入式 2023-06-22 11:47 次阅读

嵌入式中printf 这种功能强大的函数可谓是c语言库函数的中的一股清流!也就是太好用了吧!今天分享的例程有 stm32f4ZG 和 cc2530f256,这个两款芯片的移植例程和移植教程!相信你看完后也可以移植到别的芯片去!

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

可能会因为有些版本不同配置就略有所不同!

(f4)串口1:

图片

(f4)串口2:

图片

下面这个是TI 的cc2530(就先跑着寄存器版本的吧,协议栈里头配置差不太多!):

图片

为啥要移植呢!相信学过实时操作系统的都有所了解,有个叫互斥信号量的东西!就是为了防止同一时间内有两个寄存器(那十来个寄存器,不是指外设!)在访问同一块内存!这个很严重的,可能会导致程序死机,或者卡在了某个死循环里面!

我们所使用的 printf 就是首先通过 vsprinf 对我们传进来的参数进行格式化,我们传进去多少数据,他按照我们传进来的格式,格式化后统统存放在一个buf里,如果我们定义了重定向,它就会把这个buf发送至你要发送的地方!

想象一下,如果在某个系统中有一个线程在vsprintf里面运行,突然有一个任务级别比他高的任务把它运行的时间抢了过去!而任务优先级高的任务也在printf里面使用了那个buf,那就会产生上述的问题!

那就意味着我们所使用的 printf 存在不安全问题!当然我们在系统中可以通过临界保护区来处理,也可以通过信号量等等处理!

但是目前有一个线程安全的函数,摆在你面前,就问你用不用?

那我们的上边 printf_u1 它是怎么处理的呢?毫无疑问,看代码就能知道,它是直接发送的,也就是说你传进来的每一个参数它都会顺手就发送出去(当然要看你配置),它的数据将不会存放在一个 buf 里边,在发送。这就是他给力的地方了!

keil移植printf

首先,我们到文章的末尾获取到源代码后,打开 keil 软件, 点击 project > Options for… 就能打开一下页面:

图片

点击 C/C++,选择c99标准。到此为止编译器配置完毕!

下面来配置代码部分,打开头文件为printf.h:

图片

1,添加这个两个文件的路径还有头文件,如果不懂可以搜搜!

2,点击图片上面的printf_ 去它定义的地方,我们要做出一定的修改。

图片

来到这里之后我们可以看到_vsprintf 这个代码里面最复杂的就是这一串函数了!

//我们只需要关心第一个参数即可!它是一个函数指针
static int _vsnprintf(out_fct_type out, char* buffer, const size_t maxlen, const char* format, va_list va)
//指向了一个参数为下图的函数,返回值为void
typedef void (*out_fct_type)(char character, void* buffer, size_t idx, size_t maxlen);

我们只要修改这_putchar 里面的内容即可。参数二是我加上去的为了区分不同的串口类型,有多少个串口就的写多少个_out_char 这样的函数(这个是我的方法):

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第一参数
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 就是我们数据最终流向的地方了!我是这样写的。

void _putchar(char character,char sw)
{
  // send char to console etc.
  if(sw == 1)
  {
    while((USART1- >SR&0X40)==0);//循环发送,直到发送完毕
    USART1- >DR = (u8) character;
  }
  if(sw == 2)
  {
  while((USART2- >SR&0X40)==0);//循环发送,直到发送完毕
     USART2- >DR = (u8) character;
  }
  if(sw == 3)
  {
  while((USART3- >SR&0X40)==0);//循环发送,直到发送完毕
     USART3- >DR = (u8) character;
  }
}

这个 USART3->DR 为stm32串口的寄存器!读者可参照自己的芯片来配置!

简单就完了!

IAR 配置方法

首先添加文件:

图片

我在这里起名字为 C_Library。然后在添加文件:

图片

选择 printf.c (反正就是添加这个文件,放到哪里看你自己):

图片

接着就是添加编译器头文件路径:

图片

图片

在选择第一个大框框右边的那个:

图片

点击Click to add。选择头文件路径所在的文件夹后 select,接着就会回到这里:

图片

上面是配置头文件路径的,第一个是绝对路径,也就是说你工程文件移动了,就回到不到了,第二个是相对路径!选第二个吧!

接着编译就会发现报错了!!!

不要慌!我们首先选择Options > General Options:

图片

此时在编译一次,就会发现也还是错了!说什么没定义。

经研究,哦,原来是stdint.h这个头文件在for 8051 这款工具上,没有定义64为的无符号整形,那个怎么办啊!

经发现,哦 ,原来注释这个宏就行!

图片

程序编译通过!printf_u0 和stm32 配置类型,无非就是修改一下数据的流向!读者自己研究一下吧!!

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348743
  • 移植
    +关注

    关注

    1

    文章

    367

    浏览量

    27854
  • 函数
    +关注

    关注

    3

    文章

    3868

    浏览量

    61309
收藏 人收藏

    评论

    相关推荐

    CC2530F128使用ZStack需要修改哪些?

    ZStack-CC2530-2.5.1a中的例程都是针对CC2530F256的么?我现在用的板子是F128的,需要怎么改呢?我编译了一下SimpleApp的协调器版本,得到如下图所示结果,代码量
    发表于 02-23 14:33

    【NUCLEO-F412ZG试用体验】移植MicroPython在NUCLEO-F412ZG上运行

    411RE、STM32F4DISC、ESP8266、CC3200等开发板。最近刚拿到申请的NUCLEO-F412ZG,便进行了移植和运行测试。移植
    发表于 11-08 21:20

    CC2530F256RHAR 无线收发器芯片

    结合了领先的RF 收发器的优良性能,业界标准的增强型8051 CPU,系统内可编程闪存,8-KB RAM 和许多其他强大的功能。CC2530 有不同的闪存版本:CC2530F256/128,分别
    发表于 10-18 10:27

    关于CC2530 F256 芯片的问题

    上的芯片编号是 CC2530 F256 TI 28J  P63N G4  , 新买的芯片是: CC2530 F256 TI 28J P2TK
    发表于 06-21 05:26

    关于CC2530F128使用ZStack需要哪些修改

    ZStack-CC2530-2.5.1a中的例程都是针对CC2530F256的么?  我现在用的板子是F128的,需要怎么改呢? 我编译了一下SimpleApp的协调器版本,得到如下图所示结果,代码
    发表于 06-21 12:10

    关于CC2530F256 的内存分配问题

    各位大师:大家好!第一次发帖,请多多包涵。本人最近在做一个项目:利用CC2530F256芯片进行开发,其中要求功能之一为对射频芯片的IEEE地址进行软件修改,即对flash的write操作;看了许多
    发表于 08-08 07:49

    请教关于CC2530F256芯片flash lock bits控制问题

    您好:我们在使用CC2530F256芯片时候,将设备发到现场使用155台有60台出现flash被擦除而没有写入真实数据,导致我们boot和app程序丢失无法正常运行。该问题出现概率相当高且导致项目
    发表于 08-10 06:44

    请问程序怎么样修改CC2530F128芯片能运行ZLL

    Z-Stack Lighting 1.0.2 + IAR 8051 9.10编译ZLLRC -EndDevice工程, 在芯片选择CC2530F256可以通过, 但选择CC2530F128就会
    发表于 08-17 07:22

    CC2530F256RHAR 无线收发器芯片

    结合了领先的RF 收发器的优良性能,业界标准的增强型8051 CPU,系统内可编程闪存,8-KB RAM 和许多其他强大的功能。CC2530 有不同的闪存版本:CC2530F256/128,分别
    发表于 02-15 17:27

    CC2530F256RHAR 无线收发器芯片

    结合了领先的RF 收发器的优良性能,业界标准的增强型8051 CPU,系统内可编程闪存,8-KB RAM 和许多其他强大的功能。CC2530 有不同的闪存版本:CC2530F256/128,分别
    发表于 03-23 11:04

    TI CC2530F256芯片无法程序控制flash加解锁最后16字节的原因?

    您好: 我现在使用CC2530F256芯片,用TI专门的烧写工具可以对flash加解锁16字节进行加解锁操作。但是现在我想通过调用HalFlashWrite()函数软件控制BANK7的page127
    发表于 08-10 08:14

    CC2530的相关资料推荐

    超低功耗要求的系统。运行模式之间的转换时间短进一步确保了低能源消耗。CC2530F256 结合了德州仪器的业界
    发表于 12-10 08:25

    CC2530F256RHAR 无线收发器芯片 ZigBee 解决方案

    CC2530F256/128,分别具有 256/128KB 的闪存。具有不同的运行模式,使得它尤其适应超低功耗要求的系统。运行模式之间的转换时间短进一步确保了低能源消耗。CC2530F256 结合了德州仪器
    发表于 10-11 15:07

    片上系统SoC芯片CC2530F256数据手册

    8051 MCU的领先射频收发器具有优异的性能可编程闪存、8-KB RAM和许多其他强大功能。CC2530有四种不同的闪存版本:CC2530F32/64/128/256,分别具有32/64/128/
    发表于 07-21 15:32 3次下载

    CC2530 芯片介绍

    源消耗。 CC2530F256 结合了德州仪器的业界领先的黄金单元ZigBee 协议栈(Z-Stack™),提供了一个强大和完整的ZigBee 解决方案。 CC2530F64 结合了德州
    发表于 01-03 11:00 2842次阅读