Tag: 微控制器

函数返回无穷大的字符串导致嵌入式编译器

我正在尝试执行字符串到双重转换。 在gnu c编译器中我得到了正确的值。 但是如果我在我的嵌入式编译器(renesas CS +)中使用它,它会给出未定义的行为,比如返回无穷大的结果。 这是我的代码: double str_to_double_func(char a[]) { char str[30] = {‘0′}; int loop ; double result; int len ; int pos,n; for(loop = 0;a[loop]!=’\0’;loop++) { str[loop] = a[loop]; } str[loop] = ‘\0’; pos = 0; len = sizeof(str)-1; for (n = 0; n < len; n++) { if (str[n] == '.') […]

UART寄存器未调试到终端

这是两个atmega328p控制器之间的UART传输。 我试图通过从接收控制器上的数据结构中打印变量来确认数据是否正确传递。 我的终端没有显示任何信息。 我只能确认从我的LED调用到达代码,我启用了portB。 我很确定我的BAUD率是正确的(51为8mhz)。 同时确信硬件正确连接。 有关如何进一步调试以找到问题的任何建议? 我是AVR开发的新手,所以也许对其他人来说很明显。 传递 #include #include typedef struct { uint8_t data; uint8_t timestamp; } tData; //Waits until bits are set to grab data char readChar() { while (! (UCSR0A & (1 << RXC0)) ); return UDR0; } //Waits until buffer is empty void writeChar(char data) { while(!(UCSR0A & (1<<UDRE0))); UDR0 […]

将汇编转换为C

我正在尝试写入PIC18F87J11上的闪存,但我在理解汇编时遇到了问题。 我的PIC的数据表只有汇编,我正在使用C编译器。 我想知道是否有人可以帮助我将这部分代码翻译成C语言。 此代码可在此处找到,第7.5节。 MOVLW CODE_ADDR_UPPER ; Load TBLPTR with the base address MOVWF TBLPTRU MOVLW CODE_ADDR_HIGH MOVWF TBLPTRH MOVLW CODE_ADDR_LOW MOVWF TBLPTRL MOVLW DATA0 MOVWF TABLAT TBLWT*+ MOVLW DATA1 MOVWF TABLAT TBLWT* PROGRAM_MEMORY BSF EECON1, WPROG ; enable single word write BSF EECON1, WREN ; enable write to memory BCF INTCON, GIE ; disable […]

sprintf在IAR微控制器中破坏arrays

我目前正在学习嵌入式编程,因此使用带有ARM架构的TI微控制器在IAR平台上工作。 由于我完全不熟悉与此类编程或C编程相关的技术,我想问一个基本问题: 我有以下简单的代码片段: int i; for(i = 0; i < NUM_SAMPLES; i++) { sinTable[i] = sinf(2*i*dT*PI); } for(i = 0; i < NUM_SAMPLES; i++) { char out[32]; sprintf(out,"sin: %.7f, %.7f;", i*dT, sinTable[i]); putString(out); delay(DELAY_100US); } 其中sinTable[]是一个大小为NUM_SAMPLES的全局变量, NUM_SAMPLES putString(*char)是一个写入RS232端口的函数,而delay(float)是一个简单的延迟函数。 我的问题是,一旦sprintf(…)被调用,它就会破坏sinTable ,当在COM信号的接收器端绘制表格时会给出一些非常特殊的结果。 我不希望我的内存不足,因为MC有64KB SRAM。 有人有想法吗?

擦除外部FLASH

我正在使用MCF51EM256飞思卡尔微控制器,我有一些问题要将数据存储在外部闪存中以使其持久化。 我需要存储这个结构: typedef struct { ui64_s Ea_ps; ui64_s Ea_ng; ui64_s Er_q1; ui64_s Er_q2; ui64_s Er_q3; ui64_s Er_q4; uint16 F_ea; uint16 F_er; }Ws_EnergyAcc64; 哪里: typedef union{ uint64 v; uint32 p[2]; } ui64_s; 和: typedef unsigned long long int uint64; typedef unsigned long int uint32; typedef unsigned short int uint16; 为此,我实现了这个function: void Save_Flash_WsEnergyAcc(long addr, Ws_EnergyAcc64* Acc) { […]

如何使用内联汇编写入闪存?

我正在使用带有PIC18F87J11的 MPLAB C18编译器,我正在尝试使用内联汇编将一些值保存到闪存中,这是C和汇编代码的组合。 看起来我可以正确地写入和读取闪存,但是一旦我重新启动PIC然后尝试读取我之前从特定地址保存的内容,我就得不到相同的值。 我将0x09保存到0xB22A地址。 就像我说的,如果我保存值然后立即读取它,一切都正确,但重置PIC后我得到0x00 。 我不是永久保存到闪存或这里真的发生了什么? 这是我的代码: 擦除内存行 _asm MOVLW 0x00 MOVWF TBLPTRU,BANKED MOVLW 0xB2 MOVWF TBLPTRH,BANKED MOVLW 0x2A MOVWF TBLPTRL,BANKED _endasm EECON1bits.FREE = 1; INTCONbits.GIE = 0; _asm MOVLW 0x55 MOVWF EECON2,BANKED MOVLW 0xAA MOVWF EECON2,BANKED _endasm EECON1bits.WR = 1; INTCONbits.GIE = 1; 写入闪存 _asm MOVLW 0x00 MOVWF TBLPTRU,BANKED MOVLW 0xB2 MOVWF […]

C:typedef union

在相关问题中找不到任何相关内容。 最有可能的是它的超级菜鸟,但无论如何我都会问/我的.h文件中有以下内容: typedef union _API_Packet_0x90{ uint8_t packet[26]; struct _pack_struct { uint8_t start; uint8_t length[2]; uint8_t addr64[8]; uint8_t addr16[2]; uint8_t options; uint8_t rfData[4]; uint8_t chksum; }; } API_Packet_0x90; API_Packet_0x90 ap90; 这是微控制器的代码,我使用的是xc8工具链(以前的Hi Tech C)。 编译器说: xbee_api.h:19:警告:缺少基本类型; int假设 xbee_api.h:19:错误:“;” 预期 xbee_api.h:19:警告:缺少基本类型; int假设 xbee_api.h:21:警告:缺少基本类型; int假设 ,这继续(错误太多) 我认为这是uint8_t,所以我添加了#include 。 不。 我以为这是关于名字的,所以我尝试了各种各样的戏剧,比如 typedef union { uint8_t packet[26]; struct _pack_struct { }; […]

微控制器内存分配

我一直想着以下问题: 在一个普通的PC中,当你分配一些内存时,你要求操作系统跟踪哪些内存段被占用,哪些内存不被占用,并且不要让你搞乱其他程序内存等等。但是微控制器,我的意思是微控制器没有运行的操作系统所以当你要求一堆内存发生了什么? 你不能简单地访问内存芯片并随机访问它因为它可能被占用…谁跟踪内存的哪些部分已被占用,并为你提供一个免费的存储位置? 编辑: 我用C语言编写了微控制器…我认为答案可能是“语言无关”。 但是让我更清楚一点:我想让这个程序在微控制器上运行: int i=0; int d=3; 是什么让我的i和d变量不存储在内存中的同一个地方?

将Fletcher校验和从32位重新编码为8位

这次转换是否正确? uint8_t fletcher8( uint8_t *data, uint8_t len ) { uint8_t sum1 = 0xff, sum2 = 0xff; while (len) { unsigned tlen = len > 360 ? 360 : len; len -= tlen; do { sum1 += *data++; sum2 += sum1; tlen -= sizeof( uint8_t ); } while (tlen); sum1 = (sum1 & 0xff) + (sum1 […]

使用自定义INF的微控制器的USB驱动程序安装问题

我正在使用恩智浦LPC1788微控制器,我正在尝试在主机上创建一个驱动程序,通过USB与它通信。 我相信我已经设法让设备正确处理标准USB请求(PC能够正确读取字符串描述符)。 但是,我在编写示例USB驱动程序并为设备安装时遇到了麻烦。 我正在使用Microsoft Visual Studio 2013.我的步骤是: 创建一个WinUSB应用程序,它生成一个“驱动程序”和“驱动程序包”项目。 修改生成的INF文件以使用我的设备的VID和PID。 构建项目 – 都成功构建。 输出文件夹包含INF文件,目录文件和WdfCoinstaller01011.dll。 通过USB插入微控制器,进入设备管理器 → 更新驱动程序软件… ,浏览到包含INF文件的文件夹并选择它。 这会导致出现以下屏幕: 我选择“无论如何安装此驱动程序软件”。 过了一会儿,就出现了这个屏幕: 我的INF文件如下: ; ; TestCubeDriver.inf ; ; Installs WinUsb ; [Version] Signature = “$Windows NT$” Class = USBDevice ClassGUID = {88BAE032-5A81-49f0-BC3D-A4FF138216D6} Provider = %ManufacturerName% CatalogFile=TestCubeDriver.cat DriverVer=04/16/2014,15.55.4.44 ; ========== Manufacturer/Models sections =========== [Manufacturer] %ManufacturerName% = Standard,NTamd64 [Standard.NTamd64] […]