不要在MCU函数里面定义超过几十个字节的数组


不要在函数里面定义超过几十个字节的数组,不然很容易出问题。

定义全局变量,或者用内存管理

-------------------------------------------------------------------------------------

如果是在函数内部定义,应该有相关的栈大小限制的。
你一下子定义192K的数组,给堆栈和其他程序不留内存了吗?其他函数如果需要使用内存,却又申请不到内存就会出现硬件错误
-------------------------------------------------------------------------------------
看你是怎么定义的了,如果加了const,那就保存在ROM中。如果申明了数组但没初始化,那就是放在RAM中的;如果初始化了,数组放在RAM中,但数组初始化的数据放在ROM中,有程序从ROM复制到RAM。
-------------------------------------------------------------------------------------
我的程序进行了相关配置和修改之后,可以定义大数组了,但是前提是我必须屏蔽掉一些调用的函数,不然程序无法正确运行。
不屏蔽的话程序总会进入HardFault_Handler()函数,不知道哪里出了问题啊。
--
你一下子定义150K的数组,给堆栈和其他程序不留内存了吗?其他函数如果需要使用内存,却又申请不到内存就会出现硬件错误
-------------------------------------------------------------------------------------
我用的是MDK,启动代码里改的
在库文件里 Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm
-------------------------------------------------------------------------------------

STM32芯片,如何将配置数据保存到Flash中?与程序一同写入Flash的吧?

ST网上有例子程序的 如果用的是STM32f407,看以下路径 stm32f4discovery_fw\STM32F4-Discovery_FW_V1.1.0\Project\Peripheral_Examples\FLASH_Program 103的基本上差不多 注意一下,你的配置数据存放的地址不用包括在编译器link的范围之内,会出问题的。 例如:告诉编译器:flash从0x80000开始,长度0x1000,你的配置数据的存放地址可从0x81000开始。这个地址的flash编译器link的时候肯定不会用
我现在用的103的芯片,库里面的例程直接就能用!


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MCU C51开发中,通常会使用UART串口来进行数据的收发,因此需要编写一个能够将数据输出到UART串口的printf函数。下面是一个简单的MCU C51的printf函数的示例,它只支持%d和%s两种格式指示符,并且只能输出到UART串口中: ```c #include <reg51.h> #define BAUDRATE 9600 void uart_init() { TMOD |= 0x20; // Timer 1 Mode 2 TH1 = 0xFD; // 9600 Baud Rate SCON = 0x50; // Serial Mode 1, 8-bit data, 1 stop bit TR1 = 1; // Start Timer 1 } void uart_send(char c) { SBUF = c; while (!TI); TI = 0; } void my_printf(const char *format, ...) { va_list args; va_start(args, format); while (*format) { if (*format == '%') { format++; if (*format == 'd') { int num = va_arg(args, int); char buf[16]; itoa(num, buf, 10); for (int i = 0; buf[i]; i++) { uart_send(buf[i]); } } else if (*format == 's') { const char *str = va_arg(args, const char*); while (*str) { uart_send(*str++); } } } else { uart_send(*format); } format++; } va_end(args); } void main() { uart_init(); my_printf("Hello, %s! Your age is %d.\n", "Alice", 25); while (1); } ``` 在这个示例中,我们首先定义了uart_init函数和uart_send函数,分别用于初始化UART串口和发送单个字符。在my_printf函数中,我们通过调用itoa函数来将整数类型转换成字符串类型,并通过uart_send函数将字符串中的每个字符依次发送出去。对于字符串类型,我们则直接通过uart_send函数将其依次发送出去。需要注意的是,在发送字符到UART串口时,需要使用while循环等待TI标志位变为1,表示发送完成。 需要注意的是,这个示例只是一个非常简单的printf函数的实现,在实际的开发中,我们应该尽量使用标准库中提供的printf函数来输出格式化数据,而不是自己编写printf函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值