Tag: msp430

有没有人为MSP430的IAR Embedded Workbench实现了__getzone()?

我不得不在我的应用程序中处理一些时间转换。 我想尽可能坚持使用标准库函数。 现在我使用time_t结构作为我的系统时基。 但是,某些设备可以将时间同步到我的设备,该时间可能是也可能不是UTC。 此外,我的设备将时间同步到另一台设备,该时间将始终为UTC。 无论如何,我可以询问用户什么时区是同步到我的设备的时间以及他们是否使用DST。 当我的设备获得时间同步时,我可以使用mktime直接生成我的时间戳(我的设备系统时间需要与他们为时间戳目的同步的时间相匹配,否则我必须不断进行转换),然后我可以如果我知道我的时间同步来自非UTC源,则使用gmtime()来获取UTC时间。 问题是默认情况下localtime()和gmtime()将返回相同的值,因为默认情况下库认为它是在UTC时间内,并且没有DST或时区偏移。 所以,我认为处理这个问题的方法是实现和覆盖库__getzone函数。 来自EW430_CompilerReference.pdf的第106页 要使__time32,__ time64和date函数有效,必须实现函数clock,__ time32,__ time64和__getzone。 无论使用__time32还是__time64取决于您用于time_t的接口,请参见time.h,第304页。 … __getzone的默认实现指定UTC(协调世界时)作为时区。 Q1:在我的推理中,我是否在正确的轨道上,做我想做的最好的方法是实现这个__getzone函数? 我跟踪的原因是因为__getzone返回的值是一个古怪的字符串w /格式如下: :[XXX [:YYY [:NNN [:DST [:DST …]]]]] 其中XXX是标准时区名称(例如,EST的GMT-5),YYY是夏令时时区名称(例如EST的GMT-4),NNN是UTC的formsHHMM的数字偏移(并且可以有 – 符号然后,DST为夏令时规则指定了一系列选项,这些规则有自己的恼人格式。 无论如何,这对我来说应该是非常直接的,因为我只担心具有相同DST规则的加拿大和美国。 Q2:有没有人有任何形成该字符串的示例代码,以便检查我对此的理解?

printf支持MSP430微控制器

我正在使用不同的C编译器升级经过全面测试的德州仪器(TI)MSP430微控制器C程序,从Quadravox,AQ430开发工具改为VisualGDB C编译器。 该程序使用VisualGDB编译零错误和零警告。 中断服务程序,定时器,UART控制等等都似乎正在工作。 但是,sprintf的某些用途不起作用。 例如: unsigned int duration; float msec; msec = (float)duration; msec = msec / 125.0; sprintf(glb_response,”break: %3.1f msec”,msec); 返回: break: %3.1f msec 这是预期的: break: 12.5 msec 我已经了解了以下内容(来自维基百科): 编译器选项–printf_support = [full | 最小| nofloat]允许您使用较小的,function受限的printf / sprintf变体,并在构建时进行选择。 有效值为: full:支持所有格式说明符。 这是默认值。 nofloat:不包括对打印浮点值的支持。 支持除%f,%g,%G,%e和%E之外的所有格式说明符。 minimal:支持打印整数,字符或字符串值,不带宽度或精度标记。 具体而言,仅支持%%,%d,%o,%c,%s和%x格式说明符 我需要对printf的全力支持。 我知道我的产品上的MSP430将支持这一点,因为这个C程序已服务多年。 我的问题是我无法弄清楚1)如果VisualGDB有将printf支持设置为full的方法,2)如果是这样,在哪里设置它。 任何和所有的评论和答案将不胜感激。

嵌入式C:注册访问

假设我们要写地址为0xc000 ,我们可以在C中定义一个宏: #define LCDCW1_ADDR 0xc000 #define READ_LCDCW1() (*(volatile uint32_t *)LCDCW1_ADDR) #define WRITE_LCDCW1(val) ((*(volatile uint32_t *)LCDCW1_ADDR) = (val)) 我的问题是,当使用任何微控制器时,请考虑一个示例MSP430,P1OUT寄存器地址为0x0021。 但是当我们使用P1OUT = 0xFFFF时; //它为P1OUT赋值0xFFFF。 我的问题是它是如何写入该地址的,例如在这种情况下为0x0021。 IDE是IAR。 我在头文件msp430g2553.h中找到了以下定义: #define P1OUT_ (0x0021u) /* Port 1 Output */ DEFC( P1OUT , P1OUT_) 我想它是定义地址,但其他宏写入或读取的位置。 任何人都可以解释P1OUT如何在该特定地址位置写入的流程? 另外请告诉我你在0x0021u中的含义是什么? 谢谢 到目前为止,我发现的细节是: 在msp430g2553.h中 #ifdef __IAR_SYSTEMS_ICC__ #include “in430.h” #pragma language=extended #define DEFC(name, address) __no_init volatile unsigned […]

16位int机器(MSP430)和32位int机器(ARM CORTEX)的减法结果不同

当下面的代码针对像MSP430微控制器这样的16位整数机器运行时, s32产生65446。 #include uint16_t u16c; int32_t s32; int main() { u16c = 100U; s32 = 10 – u16c; } 我的理解是10-u16c将隐式类型提升为unsigned int。 数学上10-u16c等于-90。 但是如何将负数表示为unsigned int呢? 当-90被提升为unsigned int时,是否意味着忽略了数字的符号? 让我们假设,数字的符号被忽略。 90的二进制表示是00000000 01011010 。 当这被分配给32位宽的有符号整数变量s32 ,转换是如何发生的? 为了使s32等于65446,90必须采用2的补码。 那将是00000000 10100110 。 我不太了解s32成为65446的过程。 在像ARM这样的32位宽整数机器中, s32是-90,这是正确的。 要在16位整数机器中修复这种情况, (int16_t)需要(int16_t)的类型转换。 这如何解决这个问题? 添加了s32六进制数据表示,如IAR Workbench(右下角)所示。 结果表明s32变为0x0000FFA6 。 因此对于MSP430,从无符号16位转换为有符号32位的机器实现,它只是预先设置16 0位。

RTC与msp430

我以前曾问过这个问题,但我想这次我可以更清楚地问一下。 以下是我的RTC测试代码。 我正在使用msp430f5418和IAR EW 5。 我的问题是在一段时间后(我们测试了15分钟以上),分钟中断比预期更早。 即,第一次,在正好60秒之后和15分钟之后,分钟中断在第45秒进行。 为什么会这样? 我们使用TI提供的库来进行RTC寄存器操作。 谁能告诉我为什么会这样? 这是代码的问题,还是库的不当使用或硬件本身的问题? 提前致谢… #include #define RTC_VALID_READ_MAX_WAIT 500U int main() { WDTCTL = WDTPW + WDTHOLD; RTCCTL01 = RTCMODE + RTCTEVIE + RTCTEV_0; RTCCTL01 |= RTCHOLD; /* Calling the routines in the workaround assembly module supplied by TI */ SetRTCYEAR (2011U); SetRTCMON (6U); SetRTCDOW (3U); SetRTCDAY (4U); […]

“static / extern uint8_t array = {0};”是否符合ANSI C规范?

我对以下代码有疑问: #include “all_needed.h” static uint8_t array[2] = {0}; void main(void) { … } 是否允许(模块)全局数组如上所述进行初始化,以使每个成员在ANSI C符合时设置为零? 我在Code Composer 5(MSP430项目)中遇到了问题,我不得不将其更改为 static uint8_t array[2] = {0, 0}; 用于正确初始化arrays的第二个成员。

MSP430G2553定时器间隔

在阅读了大约五次的文字和谷歌搜索后,我决定寻求帮助。 我目前正在使用Timer_A中断以1秒/ 10秒/ 1分钟的间隔打开/关闭两个LED。 默认程序将每秒打开/关闭LED,但我找不到在10秒和1分钟后关闭LED的方法。 我可以使用__delay_cycles(xxxx)来实现这一点,但显然这样做会破坏计时器的目的。 这是我的代码。 #include #define RedLED BIT0 #define GreenLED BIT6 #define RedLEDToggle (P1OUT ^= RedLED) #define GreenLEDToggle (P1OUT ^= GreenLED) unsigned int counter = 0; void main(void) { WDTCTL = WDTPW | WDTHOLD; //WDTCTL = WDT_MDLY_32; P1DIR = RedLED | GreenLED; P1OUT = RedLED | GreenLED; TACTL = TASSEL_2 | ID_3 […]

FreeRTOS configTICK_RATE_HZ

我使用的是FreeRTOS版本5.4的MSP430f5438。 我有一个我无法弄清楚的有趣问题。 基本上,当我将configTICK_RATE_HZ设置为不同的值时,LED会更快或更慢地闪烁; 它应该保持相同的速度。 它设置的configTICK_RATE_HZ越高,闪烁越慢,当我将TICK_RATE设置得越低时,速度越快。 vTaskDelayUntil(&xLastFlashTime,xFlashRate); 无论configTICK_RATE_HZ是什么,LED都应该每秒闪烁一次。 我介入并检查了xFlashRate以确定。 它总是=到configTICK_RATE_HZ。 码: xFlashRate = ledFLASH_RATE_BASE;//my flash base rate is 1000ms xFlashRate /= portTICK_RATE_MS; //so xFlashrate = whatever configTICK_RATE_HZ equals /* We need to initialise xLastFlashTime prior to the first call to vTaskDelayUntil().*/ xLastFlashTime = xTaskGetTickCount(); for(;;) { vTaskDelayUntil( &xLastFlashTime, xFlashRate ); vParTestToggleLED( uxLED ); flashled();//this should happen […]