历史上的今天
返回首页

历史上的今天

今天是:2025年04月18日(星期五)

正在发生

2018年04月18日 | MSP430学习小结2-程序主体结构安排及低功耗

2018-04-18 来源:eefocus

讲解430的书现在也有很多了,不过大多数都是详细说明底层硬件结构的,看了不免有些空洞和枯燥,我认为了解一个MCU的操作首先要对其基础特性有所了解,然后再仔细研究各模块的功能。

  1.首先你要知道msp430的存储器结构。典型微处理器的结构有两种:冯。诺依曼结构——程序存储器和数据存储器统一编码;哈佛结构——程序存储器和数据存储器;msp430系列单片机属于前者,而常用的mcs51系列属于后者。

  0-0xf特殊功能寄存器;0x10-0x1ff外围模块寄存器;0x200-?根据不同型号地址从低向高扩展;0x1000-0x107f seg_b0x1080_0x10ff seg_a 供flash信息存储

  剩下的从0xffff开始向下扩展,根据不同容量,例如149为60KB,0xffff-0x1100

  2.复位信号是MCU工作的起点,430的复位型号有两种:上电复位信号POR和上电清楚信号PUC。POR信号只在上电和RST/NMI复位管脚被设置为复位功能,且低电平时系统复位。而PUC信号是POR信号产生,以及其他如看门狗定时溢出、安全键值出现错误是产生。但是,无论那种信号触发的复位,都会使msp430在地址0xffff处读取复位中断向量,然后程序从中断向量所指的地址开始执行。复位后的状态不写了,详见参考书,嘿嘿。

  3.系统时钟是一个程序运行的指挥官,时序和中断也是整个程序的核心和中轴线。430最多有三个振荡器,DCO内部振荡器;LFXT1外接低频振荡器,常见的32768HZ,不用外接负载电容;也可接高频450KHZ-8M,需接负载电容;XT2接高频450KHZ-8M,加外接电容。

  430有三种时钟信号:MCLK系统主时钟,可分频1 2 4 8,供cpu使用,其他外围模块在有选择情况下也可使用;SMCLK系统子时钟,供外围模块使用,可选则不同振荡器产生的时钟信号;ACLK辅助时钟,只能由LFXT1产生,供外围模块。

  4.中断是430处理器的一大特色,因为几乎每个外围模块都能产生,430可以在没有任务时进入低功耗状态,有事件时中断唤醒cpu,处理完毕再次进入低功耗状态。

  整个中断的响应过程是这样的,当有中断请求时,如果cpu处于活动状态,先完成当前命令;如果处于低功耗,先退出,将下一条指令的pc值压入堆栈;如果有多个中断请求,先响应优先级高的;执行完后,等待中断请求标志位复位,要注意,单中断源的中断请求标志位自动复位,而多中断的标志位需要软件复位;然后系统总中断允许位SR.GIE复位,相应的中断向量值装入pc,程序从这个地址继续执行。

  这里要注意,中断允许位SR.GIE和中断嵌套问题。如果当你执行中断程序过程中,希望可以响应更高级别的中断请求时,必须在进入第一个中断时把SR.GIE置位。

  其实,其他的外围模块时钟沿着时钟和中断这个核心来执行的。具体的结构我也不罗索了,可以参考430系列手册。

  明天开始,讲述msp430单片机C语言编程的故事

  上回把430单片机的基础特性交待了一下,让大家整体有了结构的印象,今天我想在写一下c语言对430编程的整体结构。基本上属于框架结构,即整体的模块化编程,其实这也是硬件编程的基本法则拉(可不是我规定的法则哦)。

  首先是程序的头文件,包括#include ,这是14系列,因为常用149;其他型号可自己修改。还可以包括#include "data.h" 等数据库头文件,或函数变量声明头文件,都是你自己定义的哦。

  接着就是函数和变量的声明 void Init_Sys(void);系统初始化

  系统初始化是个整体的概念,广义上讲包括所有外围模块的初始化,你可以把外围模块初始化的子函数写到Init_Sys()中,也可以分别写各个模块的初始化。但结构的简洁,最好写完系统的时钟初始化后,其他所用到的模块也在这里初始化。

void Init_Sys()
{
  unsigned int i;

  BCSCTL1&=~XT2OFF;       //打开XT2振荡器
  do
  {
  IFG1 &= ~OFIFG;             // 清除振荡器失效标志
  for (i = 0xFF; i > 0; i--); // 延时,等待XT2起振
}
while ((IFG1 & OFIFG) != 0);   // 判断XT2是否起振

BCSCTL2 =SELM_2+SELS;   //选择MCLK、SMCLK为XT2

//以下对各种模块、中断、外围设备等进行初始化

                ........................................

  _EINT(); //打开全局中断控制
}

  这里涉及到时钟问题,通常我们选择XT2为8M晶振,也即系统主时钟MCLK为8M,cpu执行命令以此时钟为准;但其他外围模块可以在相应的控制寄存器中选择其他的时钟,ACLK;当你对速度要求很低,定时时间间隔大时,就可以选择ACLK,例如在定时器Timea初始化中设置。

主程序:               void main( void )
                        {

                        WDTCTL = WDTPW + WDTHOLD;         //关闭看门狗

                          InitSys();   //初始化

                          //自己任务中的其他功能函数

                            。。。。。。。。。。。。。。。。。。。。。

                        while(1);

                        }

  主程序之后我要讲讲中断函数,中断是你做单片机任务中不可缺少的部分,也可以说是灵魂了(夸张吗)。

              /*****************************************************************************
                各中断函数,可按优先级依次书写
                ***********************************************************************/

举个定时中断的例子:

  初始化             void Init_Timer_A(void)
                      {
                        TACTL = TASSEL0 + TACLR;         // ACLK, clear TAR
                        CCTL0 = CCIE;                 // CCR0 中断使能
                        CCR0=32768;                   //定时1s
                        TACTL|=MC0;                   //增计数模式
                        }

  中断服务           #pragma vector=TIMERA0_VECTOR
                      __interrupt void TimerA0()

                      {

                        // 你自己要求中断执行的任务

                      }

  当然,还有其他的定时,和多种中断,各系列芯片的中断向量个数也不同。

  这就是简单的整体程序框架,写得简单啦,还忘谅解,明天详细了解一下各外围模块的初始化和功能。


  整体的程序设计结构,包括了所有外围模块及内部时钟,中断,定时的初始化。具体情况大家可以根据自己的需要添加或者减少,记住,模块化设计时最有力的武器。

  这可是个人总结的经典阿,谢谢支持。因为经常使用149,所以这是149的结构,其他的再更改,根据个人需要。


[cpp] view plain copy

  1. /*****************************************************************************/  

  2. 文件名:main.c  

  3. 描述:MSP430框架程序。适用于MSP430F149,其他型号需要适当改变。  

  4.     不使用的中断函数保留或者删除都可以,但保留时应确保不要打开不需要的中断。  

  5.     

  6. /*****************************************************************************/  

  7.   

  8. //头文件  

  9. #include   

  10.   

  11. //函数声明  

  12. void InitSys();  

  13.   

  14.   

  15. int main( void )  

  16. {  

  17.   

  18. WDTCTL = WDTPW + WDTHOLD;         //关闭看门狗  

  19.   

  20. InitSys();   //初始化  

  21.   

  22. start:  

  23. //以下填充用户代码  

  24.   

  25.   

  26. LPM3;   //进入低功耗模式n,n:0~4。若不希望进入低功耗模式,屏蔽本句  

  27. goto start;  

  28.   

  29. }  

  30.   

  31. /***************************************************************************** 

  32. 系统初始化 

  33. ******************************************************************************/  

  34. void InitSys()  

  35. {  

  36.   unsigned int iq0;  

  37.   

  38. //使用XT2振荡器  

  39.   BCSCTL1&=~XT2OFF;       //打开XT2振荡器  

  40.   do  

  41.   {  

  42.   IFG1 &= ~OFIFG;   // 清除振荡器失效标志  

  43.   for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振  

  44. }  

  45. while ((IFG1 & OFIFG) != 0);   // 判断XT2是否起振  

  46.   

  47. BCSCTL2 =SELM_2+SELS;   //选择MCLK、SMCLK为XT2  

  48.   

  49. //以下填充用户代码,对各种模块、中断、外围设备等进行初始化  

  50.   

  51.   _EINT(); //打开全局中断控制,若不需要打开,可以屏蔽本句  

  52. }  

  53.   

  54. /***************************************************************************** 

  55. 端口2中断函数 

  56. ******************************************************************************/  

  57. #pragma vector=PORT2_VECTOR  

  58. __interrupt void Port2()  

  59. {  

  60. //以下为参考处理程序,不使用的端口应当删除其对于中断源的判断。  

  61. if((P2IFG&BIT0) == BIT0)  

  62. {  

  63. //处理P2IN.0中断  

  64. P2IFG &= ~BIT0; //清除中断标志  

  65. //以下填充用户代码  

  66.   

  67. }  

  68. else if((P2IFG&BIT1) ==BIT1)  

  69. {  

  70. //处理P2IN.1中断  

  71. P2IFG &= ~BIT1; //清除中断标志  

  72. //以下填充用户代码  

  73.   

  74. }  

  75. else if((P2IFG&BIT2) ==BIT2)  

  76. {  

  77. //处理P2IN.2中断  

  78. P2IFG &= ~BIT2; //清除中断标志  

  79. //以下填充用户代码  

  80.   

  81. }  

  82. else if((P2IFG&BIT3) ==BIT3)  

  83. {  

  84. //处理P2IN.3中断  

  85. P2IFG &= ~BIT3; //清除中断标志  

  86. //以下填充用户代码  

  87.   

  88. }  

  89. else if((P2IFG&BIT4) ==BIT4)  

  90. {  

  91. //处理P2IN.4中断  

  92. P2IFG &= ~BIT4; //清除中断标志  

  93. //以下填充用户代码  

  94.   

  95. }  

  96. else if((P2IFG&BIT5) ==BIT5)  

  97. {  

  98. //处理P2IN.5中断  

  99. P2IFG &= ~BIT5; //清除中断标志  

  100. //以下填充用户代码  

  101.   

  102. }  

  103. else if((P2IFG&BIT6) ==BIT6)  

  104. {  

  105. //处理P2IN.6中断  

  106. P2IFG &= ~BIT6; //清除中断标志  

  107. //以下填充用户代码  

  108.   

  109. }  

  110. else  

  111. {  

  112. //处理P2IN.7中断  

  113. P2IFG &= ~BIT7; //清除中断标志  

  114. //以下填充用户代码  

  115.   

  116. }  

  117.   

  118. LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽  

  119. }  

  120.   

  121. /***************************************************************************** 

  122. USART1发送中断函数 

  123. ******************************************************************************/  

  124. #pragma vector=USART1TX_VECTOR  

  125. __interrupt void Usart1Tx()  

  126. {  

  127. //以下填充用户代码  

  128.   

  129.   

  130. LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽  

  131. }  

  132.   

  133. /***************************************************************************** 

  134. USART1接收中断函数 

  135. ******************************************************************************/  

  136. #pragma vector=USART1RX_VECTOR  

  137. __interrupt void Ustra1Rx()  

  138. {  

  139. //以下填充用户代码  

  140.   

  141.   

  142. LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽  

  143. }  

  144.   

  145. /***************************************************************************** 

  146. 端口1中断函数 

  147. 多中断中断源:P1IFG.0~P1IFG7 

  148. 进入中断后应首先判断中断源,退出中断前应清除中断标志,否则将再次引发中断 

  149. ******************************************************************************/{{分页}}  

  150. #pragma vector=PORT1_VECTOR  

  151. __interrupt void Port1()  

  152. {  

  153. //以下为参考处理程序,不使用的端口应当删除其对于中断源的判断。  

  154. if((P1IFG&BIT0) == BIT0)  

  155. {  

  156. //处理P1IN.0中断  

  157. P1IFG &= ~BIT0; //清除中断标志  

  158. //以下填充用户代码  

  159.   

  160. }  

  161. else if((P1IFG&BIT1) ==BIT1)  

  162. {  

  163. //处理P1IN.1中断  

  164. P1IFG &= ~BIT1; //清除中断标志  

  165. //以下填充用户代码  

  166.   

  167. }  

  168. else if((P1IFG&BIT2) ==BIT2)  

  169. {  

  170. //处理P1IN.2中断  

  171. P1IFG &= ~BIT2; //清除中断标志  

  172. //以下填充用户代码  

  173.   

  174. }  

  175. else if((P1IFG&BIT3) ==BIT3)  

  176. {  

  177. //处理P1IN.3中断  

  178. P1IFG &= ~BIT3; //清除中断标志  

  179. //以下填充用户代码  

  180.   

  181. }  

  182. else if((P1IFG&BIT4) ==BIT4)  

  183. {  

  184. //处理P1IN.4中断  

  185. P1IFG &= ~BIT4; //清除中断标志  

  186. //以下填充用户代码  

  187.   

  188. }  

  189. else if((P1IFG&BIT5) ==BIT5)  

  190. {  

  191. //处理P1IN.5中断  

  192. P1IFG &= ~BIT5; //清除中断标志  

  193. //以下填充用户代码  

  194.   

  195. }  

  196. else if((P1IFG&BIT6) ==BIT6)  

  197. {  

  198. //处理P1IN.6中断  

  199. P1IFG &= ~BIT6; //清除中断标志  

  200. //以下填充用户代码  

  201.   

  202. }  

  203. else  

  204. {  

  205. //处理P1IN.7中断  

  206. P1IFG &= ~BIT7; //清除中断标志  

  207. //以下填充用户代码  

  208.   

  209. }  

  210.   

  211. LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽  

  212. }  

  213.   

  214. /***************************************************************************** 

  215. 定时器A中断函数 

  216. 多中断中断源:CC1~2 TA 

  217. ******************************************************************************/  

  218. #pragma vector=TIMERA1_VECTOR  

  219. __interrupt void TimerA1()  

  220. {  

  221. //以下为参考处理程序,不使用的中断源应当删除  

  222. switch (__even_in_range(TAIV, 10))  

  223. {  

  224. case 2:  

  225.   //捕获/比较1中断  

  226.   //以下填充用户代码  

  227.   

  228. break;  

  229. case 4:  

  230.   //捕获/比较2中断  

  231.   //以下填充用户代码  

  232.   

  233. break;  

  234. case 10:  

  235.   //TAIFG定时器溢出中断  

  236.   //以下填充用户代码  

  237.   

  238. break;  

  239. }  

  240.   

  241.   

  242. LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽  

  243. }  

  244.   

  245. /***************************************************************************** 

  246. 定时器A中断函数 

  247. 中断源:CC0 

  248. ******************************************************************************/  

  249. #pragma vector=TIMERA0_VECTOR  

  250. __interrupt void TimerA0()  

  251. {  

  252. //以下填充用户代码  

  253.   

  254.   

  255. LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽  

  256. }  

  257.   

  258. /***************************************************************************** 

  259. AD转换器中断函数 

  260. 多中断源:摸拟0~7、VeREF+、VREF-/VeREF-、(AVcc-AVss)/2 

  261. 没有处理ADC12TOV和ADC12OV中断标志 

  262. ******************************************************************************/  

  263. #pragma vector=ADC_VECTOR  

  264. __interrupt void Adc()  

  265. {  

  266. //以下为参考处理程序,不使用的中断源应当删除  

  267. if((ADC12IFG&BIT0)==BIT0)  

  268. {  

  269. //通道0  

  270. //以下填充用户代码  

  271.   

  272. }  

  273. else if((ADC12IFG&BIT1)==BIT1)  

  274. {  

  275. //通道1  

  276. //以下填充用户代码  

  277.   

  278. }  

  279. else if((ADC12IFG&BIT2)==BIT2)  

  280. {  

  281. //通道2  

  282. //以下填充用户代码  

  283.   

  284. }  

  285. else if((ADC12IFG&BIT3)==BIT3)  

  286. {  

  287. //通道3  

  288. //以下填充用户代码  

  289.   

  290. }  

  291. else if((ADC12IFG&BIT4)==BIT4)  

  292. {  

  293. //通道4  

  294. //以下填充用户代码  

  295.   

  296. }  

  297. else if((ADC12IFG&BIT5)==BIT5)  

  298. {  

  299. //通道5  

  300. //以下填充用户代码  

  301.   

  302. }  

  303. else if((ADC12IFG&BIT6)==BIT6)  

  304. {  

  305. //通道6  

  306. //以下填充用户代码  

  307.   

  308. }  

  309. else if((ADC12IFG&BIT7)==BIT7)  

  310. {  

  311. //通道7  

  312. //以下填充用户代码  

  313.   

  314. }  

  315. else if((ADC12IFG&BIT8)==BIT8)  

  316. {  

  317. //VeREF+  

  318. //以下填充用户代码  

  319.   

  320. }  

  321. else if((ADC12IFG&BIT9)==BIT9)  

  322. {  

  323. //VREF-/VeREF-  

  324. //以下填充用户代码  

  325.   

  326. }  

  327. else if((ADC12IFG&BITA)==BITA)  

  328. {  

  329. //温度  

  330. //以下填充用户代码  

  331.   

  332. }  

  333. else if((ADC12IFG&BITB)==BITB)  

  334. {  

  335. //(AVcc-AVss)/2  

  336. //以下填充用户代码  

  337.   

  338. }  

  339.   

  340. LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽  

  341. }  

  342.   

  343. /***************************************************************************** 

  344. USART0发送中断函数 

  345. ******************************************************************************/  

  346. #pragma vector=USART0TX_VECTOR  

  347. __interrupt void Usart0Tx()  

  348. {  

  349. //以下填充用户代码  

  350.   

  351.   

  352. LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽  

  353. }  

  354.   

  355. /***************************************************************************** 

  356. USART0接收中断函数 

  357. ******************************************************************************/  

  358. #pragma vector=USART0RX_VECTOR  

  359. __interrupt void Usart0Rx()  

  360. {  

  361. //以下填充用户代码{{分页}}  

  362.   

  363.   

  364. LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽  

  365. }  

  366.   

  367. /***************************************************************************** 

  368. 看门狗定时器中断函数 

  369. ******************************************************************************/  

  370. #pragma vector=WDT_VECTOR  

  371. __interrupt void WatchDog()  

  372. {  

  373. //以下填充用户代码  

  374.   

  375.   

  376. LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽  

  377. }  

  378.   

  379. /***************************************************************************** 

  380. 比较器A中断函数 

  381. ******************************************************************************/  

  382. #pragma vector=COMPARATORA_VECTOR  

  383. __interrupt void ComparatorA()  

  384. {  

  385. //以下填充用户代码  

  386.   

  387.   

  388. LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽  

  389. }  

  390.   

  391. /***************************************************************************** 

  392. 定时器B中断函数 

  393. 多中断源:CC1~6 TB 

  394. ******************************************************************************/  

  395. #pragma vector=TIMERB1_VECTOR  

  396. __interrupt void TimerB1()  

  397. {  

  398. //以下为参考处理程序,不使用的中断源应当删除  

  399. switch (__even_in_range(TBIV, 14))  

  400. {  

  401. case 2:  

  402.   //捕获/比较1中断  

  403.   //以下填充用户代码  

  404.   

  405. break;  

  406. case 4:  

  407.   //捕获/比较2中断  

  408.   //以下填充用户代码  

  409.   

  410. break;  

  411. case 6:  

  412.   //捕获/比较3中断  

  413.   //以下填充用户代码  

  414.   

  415. break;  

  416. case 8:  

  417.   //捕获/比较4中断  

  418.   //以下填充用户代码  

  419.   

  420. break;  

  421. case 10:  

  422.   //捕获/比较5中断  

  423.   //以下填充用户代码  

  424.   

  425. break;  

  426. case 12:  

  427.   //捕获/比较6中断  

  428.   //以下填充用户代码  

  429.   

  430. break;  

  431. case 14:  

  432.   //TBIFG定时器溢出中断  

  433.   //以下填充用户代码  

  434.   

  435. break;  

  436. }  

  437.   

  438. LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽  

  439. }  

  440.   

  441. /***************************************************************************** 

  442. 定时器B中断函数 

  443. 中断源:CC0 

  444. ******************************************************************************/  

  445. #pragma vector=TIMERB0_VECTOR  

  446. __interrupt void TimerB0()  

  447. {  

  448. //以下填充用户代码  

  449.   

  450. LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽  

  451. }  

  452.   

  453. /***************************************************************************** 

  454. 不可屏蔽中断函数 

  455. ******************************************************************************/  

  456. #pragma vector=NMI_VECTOR  

  457. __interrupt void Nmi()  

  458. {  

  459. //以下为参考处理程序,不使用的中断源应当删除  

  460. if((IFG1&OFIFG)==OFIFG)  

  461. {  

  462. //振荡器失效  

  463. IFG1 &= ~OFIFG;  

  464. //以下填充用户代码  

  465.   

  466. }  

  467. else if((IFG1&NMIIFG)==NMIIFG)  

  468. {  

  469. //RST/NMI不可屏蔽中断  

  470. IFG1 &= ~NMIIFG;  

  471. //以下填充用户代码  

  472.   

  473. }  

  474. else //if((FCTL3&ACCVIFG)==ACCVIFG)  

  475. {  

  476. //存储器非法访问  

  477. FCTL3 &= ~ACCVIFG;  

  478. //以下填充用户代码  

  479.   

  480. }  

  481.   

  482. LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽  

  483. }  

  484.   

  485. /***************************************************************************** 

  486. 基本定时器中断函数 

  487. ******************************************************************************/  

  488. #pragma vector=BASICTIMER_VECTOR  

  489. __interrupt void BasTimer()  

  490. {  

  491. //以下填充用户代码  

  492.   

  493. LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽  

  494. }  



推荐阅读

史海拾趣

HOPERF公司的发展小趣事

凭借卓越的产品性能和完善的解决方案,HOPERF的产品在多个领域得到了广泛应用。从户外运动、电子导航到工业测量、环境监测,再到医疗健康、智能家居等领域,HOPERF的产品几乎覆盖了人们生活的方方面面。公司不仅提供标准化的产品,还根据客户的实际需求提供个性化定制服务,极大地满足了市场的多样化需求。这种灵活多变的市场策略使得HOPERF在全球市场上迅速拓展,赢得了大量品牌客户的青睐和合作。

以上五个故事展示了HOPERF公司在电子行业中的发展历程和成就,充分体现了其在技术创新、产业链整合、全球化布局、质量控制以及市场拓展等方面的综合实力。

Custom LeatherCraft Manufacturing Co Inc公司的发展小趣事

随着电子行业的迅速发展,工程师和技术人员需要携带的工具和设备也越来越多。CLC敏锐地捕捉到了这一变化,开始研发具有更多功能和口袋的工具包。同时,他们还引入了新的材料和技术,使产品更加轻便、耐用。这些创新设计不仅满足了客户的需求,还进一步巩固了CLC在市场上的地位。

科山芯创(COSINE)公司的发展小趣事

自成立以来,科山芯创始终坚持技术创新。他们投入大量资源用于研发,不断推出新产品。其中,COS8820射频收发芯片、COS6212线驱动器功放芯片等产品,凭借其优异的性能和稳定性,在市场上获得了广泛认可。这些产品的成功,不仅证明了科山芯创的技术实力,也为其在电子行业中树立了良好的口碑。

台湾双羽公司的发展小趣事

1954年,富士通研发出了日本第一台中继式自动计算机FACOM100,这一里程碑式的成就标志着富士通正式涉足信息产业。FACOM100的推出不仅在日本国内引起了轰动,也让富士通在国际上赢得了声誉。此后,富士通在计算机领域持续投入研发,不断推出新技术、新产品,逐渐成长为全球领先的计算机制造商之一。这一转变不仅推动了富士通自身的快速发展,也为全球计算机技术的进步做出了重要贡献。

帝特(DTECH)公司的发展小趣事

帝特在国内市场取得一定成绩后,开始积极拓展国际市场。公司在中国区开设了广州、深圳分公司,并在泰国和马来西亚等地设立了分公司和专卖店。通过全球化的战略布局,帝特的产品销售网络遍布东南亚、中东、非洲和美洲等国家和地区,公司的知名度和市场份额均得到了显著提升。

C&K Components公司的发展小趣事

进入新时代,C&K继续坚持创新驱动的发展战略,不断加大在研发和创新方面的投入。公司紧跟行业趋势,积极探索新技术、新工艺和新应用,推出了一系列具有创新性和领先性的开关产品。同时,C&K也注重与客户的沟通和合作,深入了解客户需求,提供个性化的解决方案和优质的服务。这些举措使C&K在激烈的市场竞争中始终保持领先地位,并赢得了更多客户的认可和支持。

这些故事展示了C&K Components公司在电子行业中的发展历程和取得的成就。从初创时期的坚持与探索,到60年代的转型与突破,再到90年代的行业领先地位确立,以及千禧年代的并购与融合和新时代的创新与发展,C&K始终保持着对技术的热爱和对市场的敏锐洞察,不断推动公司向前发展。

问答坊 | AI 解惑

ds1820读出的数据

ds1820不带B,常温下读出的数据为00H 76H,测量体温是数据为00H 88H,77H转换成10进制后118*0.5=59°度  88H=68度,显然是不对的吧?谁能告诉我是读出数据出错了,还是不会转换的问题。急等 ;将温度数据通过串口发送出去,波特率2400 ...…

查看全部问答>

请教一个有关反相时钟驱动路径的约束

电路中用相位相反的时钟去触发相邻触发器。 如果有一个触发器FF1的输出经过组合逻辑电路后与触发器FF2的输入, 除了输出延时外,请问还要如何进行约束? …

查看全部问答>

几道简单的题,哪位大虾能帮忙解答

1. Multiple Asynchronous Interrupt Signal sources could be tied together to the Processor Interrupt Input Pin, using a. Logic buffer drivers b. Logic inverter drivers c. Buffers with Open Collector/drain outputs d. Trist ...…

查看全部问答>

LCD帧频和Vsync的关系

1. 我想问一下,为什么我用的开发板,bsp里设定 FRAME_RATE = 60, 但我用示波器实测VSync信号频率是120Hz左右。 这个 FRAME_RATE 是帧频吗??还是什么信号?按理说,VSync信号频率就是帧频了。 2. 还有,关于 CLKVAL与VCLK的关系,三星使用 ...…

查看全部问答>

求救!有关WinCE6.0 R2 NandFlash驱动的新架构MDD+PDD+FMD的问题

现在NANDFlash驱动的新架构MDD+PDD+FMD已经抛弃了旧的分区驱动mspart和MBR格式,采用region+partition的概念,整个nandflash分为多个region,每个region又可分为多个partition,每个region的开头有一个分区表。 有哪位达人知道这个分区表的格式? ...…

查看全部问答>

有谁弄过WINCE5.0或MOBILE下的CSR蓝牙服务,给钱的

有谁弄过WINCE5.0或MOBILE下的CSR蓝牙服务? 能做到: 1. 透过蓝牙传送文件 2. 透过蓝牙耳机连上VOICE IN/OUT 我正弄这个, 我研究了段时间,没搞定,找到了设备,提供不了服务. 哪位大哥弄好过???????????????? 救救我啊!!! 给钱也行啊, 不要太 ...…

查看全部问答>

指令在哪?

我想开始一个I/O 程序,如何开始?指令及汇编的资料找不到,用C也不知如何开始  …

查看全部问答>

stm32CAN通讯接收必须加上仿真器?

设置成正常模式后,接收数据的时候必须用仿真器来跑才能正确接到数据 离线后,直接上电总是收不到正确的数,何解? 代码: int main(void) { #ifdef DEBUG   debug(); #endif   /* System Clocks Configuration * ...…

查看全部问答>

数字滤波器的优点及工作方式

  数字滤波器是一种利用程序运算将模数转换后的数据值进行预定要求的处理的运算部件,它是对数字信号进行滤波处理以得到期望的响应特性的离散时间系统。作为一种电子滤波器(滤波器电路),数字滤波器与完全工作在模拟信号域的模拟滤波器不同。数 ...…

查看全部问答>

求CCS v3.3.82.13 下载地址

网上找不到啊 求个地址…

查看全部问答>