Tag: keil

与arm微控制器串行通信

我试图通过usb从arm cortrx m4微控制器发送数据到pc。 在codeblocks ide中有一个用C ++语言编写的程序。 基本上,程序使用ReadFile函数设置串行通信设置和读取数据。 问题是即使pc proogram和微控制器中的波特率相同,我在输出端也会得到垃圾值。 我怎么解决这个问题? 电脑程序如下所示。 #include #include int main(void) { HANDLE hComm; // Handle to the Serial port char ComPortName[] = “\\\\.\\COM51”; // Name of the Serial port to be opened, BOOL Status; // Status of the various operations DWORD dwEventMask; // Event mask to trigger char TempChar; // […]

重新启动后,位字段为keil hardfault

当我在闪存设备之后使用此结构时它运行良好,但在使用此结构重新启动(电源开/关)(分配给任何位)后会导致HardFault irq。 我使用Keil uVision和STM32F205。 为什么它不起作用? 我应该更改/删除/添加什么来修复它? 直接使用GPIOC-> ODR不会导致Kail中的位域有什么问题吗? #pragma anon_unions typedef union { struct { __IO uint16_t Data_Bus:8; // 0-7 data bus __IO uint16_t Ctr_Pins:6; // 8-13 control pins __IO uint16_t :2; // 14-15 unused here }; struct { __IO uint16_t D0:1; // 0 data bus pin __IO uint16_t D1:1; // 1 data bus pin […]

UINT32_C和uint32_t之间的区别

据我所知, uint32_t中的后缀t表示名称,但我想知道UINT32_C中的C是什么 ,有什么区别?

如何在ARM7中进行primefaces比较和交换?

我想修改一个全局变量,它由RTOS中的不同任务和IRQ上下文共享。 因此我需要primefaces地修改这个变量。 在我当前的实现中,我一直在使用enable_irq / disable_irq函数来自动修改语句。 extern int g_var; void set_bit_atomic(int mask) { disable_irq(); g_var |= mask; enable_irq(); } 我在GCC 文档中找到了__sync_bool_compare_and_swap函数作为primefaces操作的帮助器。 我目前的工具链是KEIL MDK,我想切换到下面显示的方法, void set_bit_atomic(int mask) { volatile int tmp; do { tmp = g_var; } while (!__sync_bool_compare_and_swap(&g_var, tmp, tmp | mask)); } 如何在ARMv4命令集中编写__sync_bool_compare_and_swap函数(作为内联汇编)?

如何在Cortex-M3(STM32)上从RAM执行function?

我正在尝试从Cortex-M3处理器(STM32)上的RAM执行一个函数。 该function擦除并重写内部闪存,所以我肯定需要在RAM中,但我该怎么做? 我试过的是:使用memcpy将函数复制到RAM中的字节数组(检查它是否正确对齐),将函数指针设置为指向字节数组然后调用函数(指针)。 这可能适用于10条指令(我可以跟随调试器的执行)但然后我得到一个总线错误并且处理器重置。 第二次通过循环时发生总线错误,因此代码应该没问题(因为它在第一次传递时起作用)。 我认为更快的RAM访问会以某种方式破坏总线时序…… 无论如何有一个正确的方法来做到这一点? 分散文件如何将函数自动放入RAM中(我使用Keil uVision for Cortex-M3)? 编辑:更多信息:工具链:RealView MDK-ARM V 4.10编译器:Armcc v4.0.0.728汇编程序:Armasm v4.0.0.728链接器:ArmLink v4.0.0.728处理器:STM32F103ZE 发生复位时,IMPRECISERR位在总线故障寄存器中置1。

链接器如何知道extern函数的定义在哪里?

我读了几篇post并得出结论,extern告诉编译器“这个函数存在,但它的代码在其他地方。不要惊慌。” 但链接器如何知道函数的定义位置。 我的案例: – 我正在研究Keil uvision 4.有一个头文件grlib.h,主函数在grlib_demo.c(它包括grlib.h)。 现在,有一个函数GrCircleDraw()在Circle.c中定义并在grlib_demo.c中调用,还有一个语句 extern void GrCircleDraw(所有参数); 在grlib.h中。 我的查询是链接器如何知道GrCircleDraw()的定义,因为Circle.c不包含在grlib.h和grlib_demo.c中 注意: – 文件grlib.h和Circle.c位于同一文件夹中。 代码运行成功。

printf()导致乱码

我有这个代码: unsigned char *command = “0000”; unsigned char foo = (hex_char_to_int(command[0]) << 4) | hex_char_to_int(command[1]); unsigned char bar = (hex_char_to_int(command[2]) << 4) | hex_char_to_int(command[3]); printf("foo: %02x, bar: %02x\r\n", foo, bar); 它使用此function: unsigned char hex_char_to_int(unsigned char ch) { switch (ch){ case ‘0’: return 0; case ‘1’: return 1; case ‘2’: return 2; case ‘3’: return 3; […]

为什么编译器没有警告我一个空的if语句?

我正在使用Keil uVision v4.74并启用了“All Warnings”选项。 我写了以下故意代码: if(condition matched) { //do something } 当我重建我的项目时,我得到0个错误,0个警告。 但是,当我不小心写道: if(condition matched); { //do something } 我也有0个错误,0个警告。 我几乎不可能发现那么小; if条件之后是问题的根源。 为什么编译器不将它视为警告并通知我?

Cortex M3的Bootloader

我正在使用mbed的LPC 1768板(带有cortex M3 cpu),我正在尝试在这里实现一些function,主要是从SD卡升级用户应用程序,我正在编写两个程序,首先是一个bootloader / nano-kernel,以及一个用户应用程序(helloworld将开始): 在0x00地址运行的Bootloader / nano-kernel,它会做一些检查并最终获取SD卡上的二进制文件 Bootloader / nano-kernel会将这个二进制文件复制到地址0x9000(以后可能需要更改,但bootloader / nano-kernel不会使用此空间,所以应该没问题) Bootloader跳转到0x9000 + 4的用户应用程序 Sd卡很容易解决,我遇到了跳跃部分的问题。 这是跳跃函数的代码。 void run(void) { void (*user_code_entry)(void); unsigned *p; SCB->VTOR = (USER_FLASH_START & 0x1FFFFF80); // Load contents of second word of user flash – the reset handler address // in the applications vector table p = (unsigned *)(USER_FLASH_START […]

如何在Stellaris中的程序之间跳转

我正在为Stellaris LM3S1607芯片开发一个引导加载程序。 我正在使用Keil MicroVision4 C编译器。 我们的想法是创建2个独立的固件,一个将更新另一个。 在firmware1中,我下载了firmware2文件并将其写入地址0x3200的闪存中。 直到这里它才有效。 我还validation了数据写入闪存是否正确。 现在我在flash中有两个应用程序。 一个是我的uip引导装载程序,而seoncd就是我的主要项目。 我想知道如何从第一个程序跳转到位于0x3200的第二个程序。 如果有人能帮我跳,那就太好了。 谢谢