Tag: 嵌入式

STM32L0的自动波特率检测

我无法在STM32L0上进行自动波特率检测。 我正在使用硬件抽象层(HAL)。 我的初始化代码是: /* USART1 init function */ void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 300; huart1.Init.WordLength = UART_WORDLENGTH_9B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_EVEN; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; huart1.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED; huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_AUTOBAUDRATE_INIT; huart1.AdvancedInit.AutoBaudRateEnable = UART_ADVFEATURE_AUTOBAUDRATE_ENABLE; huart1.AdvancedInit.AutoBaudRateMode = UART_ADVFEATURE_AUTOBAUDRATE_ONSTARTBIT; HAL_UART_Init(&huart1); } 我通过UART1发送的字节是: 0 1 2 3 4 […]

在位数组中有效地找到’1’的位置

我正在连接一个测试一组电线的程序,用于开路或短路。 该程序在AVR上运行,将测试向量(步行’1’)驱动到导线上并接收结果。 它将此结果向量与已存储在SD卡或外部EEPROM中的预期数据进行比较。 这是一个例子,假设我们有一组8条线,所有这些线都是直通的,即它们没有连接点。 因此,如果我们驱动0b00000010,我们应该收到0b00000010。 假设我们收到0b11000010。 这意味着线7,8和线2之间存在短路。我可以通过0b00000010 ^ 0b11000010 = 0b11000000检测我感兴趣的位。 这告诉我显然线7和8有故障,但我如何在一个大的位arrays中有效地找到这些’1’的位置。 使用位掩码只需8线即可轻松完成此操作,但我正在开发的系统必须能够处理多达300线(位)。 在我开始使用如下的宏并测试300 * 300位数组中的每个位之前,我想问一下是否有更优雅的解决方案。 #define BITMASK(b) (1 << ((b) % 8)) #define BITSLOT(b) ((b / 8)) #define BITSET(a, b) ((a)[BITSLOT(b)] |= BITMASK(b)) #define BITCLEAR(a,b) ((a)[BITSLOT(b)] &= ~BITMASK(b)) #define BITTEST(a,b) ((a)[BITSLOT(b)] & BITMASK(b)) #define BITNSLOTS(nb) ((nb + 8 – 1) / 8) 只是为了进一步说明如何检测开路。 预期数据:0b00000010,接收数据:0b00000000(导线未拉高)。 […]

在嵌入式设备上投射指针

在32位嵌入式系统上投射和修改指针时遇到了一个奇怪的问题(运行contiki OS的 redbee econotag是特定的)。 uint32_t array[2]; array[0] = 0x76543210; array[1] = 0xfedcba98; uint8_t* point = ((uint8_t*)array)+1; printf(“%08x \n”, *(uint32_t*)point ); 在我的电脑上输出: 98765432 嵌入式设备上的输出: 10765432 我的计算机的行为与我期望的一样,但嵌入式设备似乎在它到达单词的末尾时回滚。 为什么会这样?

volatile和extern有什么区别?

几天前我接受了采访,但仍然在寻找答案。 我想了解使用volatile关键字的意义。 找到下面的代码:两种不同的场景。 //project1 //File1.c int abc;//Global variable /*And this variable is getting used in some other files too.*/ if(abc == 3) //Say { printf(“abc == 3”); } else { printf(“abc != 3”); } /*So if or else part will not be optimized because “abc” can not be predicted, the value can chage at any […]

初始化变量并同时指定存储地址:是否可能?

例如,在Atmel处理器的codevision编译器中,可以指定全局变量的存储地址 int a @0x100; // will place the variable at the address 0x100 in RAM 当然,根据标准C,变量可以在声明时初始化 int a=42; 但是,我没有发现任何可能同时做到这两点。 int a @0x100 = 42或int a = 42 @0x100; 不起作用,它们会导致编译器错误。 你可能会问为什么这么做很重要,因为人们可以这样做 int a @0x100; int main() { a = 42; //… } 但是,如果我在EEPROM中有变量,我需要初始化它们,因为这是自动生成带有值的eeprom文件的唯一方法。 我不能在以后分配这些值,因为在这种情况下,它实际上会在程序的每个开始时将值写入eeprom。

与多任务下的UART FIFO相关的错误

附加程序:这些代码由我根据TI uart.c驱动程序库编写。 while(1){ //check if message on Queue -> read or check UART input if(uxQueueMessagesWaiting( UART_TASKQ ) != 0){ //may have bugs // deQueue xQueueReceive( UART_TASKQ, &UARTTaskHandle, 0x0A ); //do the task’s mission using the data in the stucture(put by control task) //Print out the input data. //**********debugging data /* testPointer = UARTTaskHandle->dataBuffer; testAmount = […]

编写C程序以调用另一个程序而不使用任何内置库

我正在尝试为boot-loader写一个简单的’go-command’,它将我带到RAM中的特定地址,例如0x18000000,它应该执行一个闪烁的程序。 我有两个.c文件说led.c和go.c,其中led.c闪烁两个LED。 但我想知道,我不知道如何将控制/调用其main()传递给此go.c文件转到该地址并开始闪烁LED? 但它应该没有包括其他头文件,库等。请帮助我! 提前致谢。 下面的代码是针对led.c的 void delay () { volatile int i; for(i=0;i<1000000;i++) {} } int main(void) { *led0=0; *led1=0; while(1) { *led0=1; delay(); *led0=0; *led1=1; delay(); *led1=0; } } 在我的go.c文件中,我想传递一个控件来调用这个led.c main()函数

Misra标准的嵌入式软件

我要求制作大量符合MISRA标准的代码。 第一个问题:有人可以根据经验对嵌入式系统编写的代码进行评估 。 据我所知,“写得好”的定义不明确,含糊不清,所以我要求进行原始估算。 第二个问题:任何可以自定义的工具建议(即允许禁止特定警告)并在自动构建环境中使用(即命令行界面) 任何其他有用的建议,可以帮助完成这项任务。 谢谢伊利亚。

Sparc函数编译对齐

我希望我的程序使得二进制文件中的每个函数在结束后都留有一些空间。 因此,稍后如果需要进行一些小的更改,则仅更改该function,并使用额外的空间作为计算较小变化的空间。 -falign-function可以完成这项工作但不会提供一致的空间。 无论如何要做到这一点? 还是更好的方法呢?

用于嵌入式系统lpcxpresso的C语言中的Modbus实现

我是modbus的新手,我必须将lpcxpresso基板编程为主机,以便使用RS485 Modbus协议从功率计收集读数。 通过从modbus.org读取规范,我熟悉协议(关于PDU ADU帧,function代码,主从)。 但是在C中编写代码时,我在实现上遇到了困难。 所以我的问题是: 我在开始连接时是否必须打开连接,设置波特率等? 我想将帧发送为byte []。 它是否正确? 或者还有其他方法吗? 数据发送必须是hex,还是二进制或整数? CRC生成和检查。 我将非常感谢所有的帮助和帮助:)对不起,如果问题不是非常具体或太基础