OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 91409|回复: 128

学习STM32中遇到的问题,一点一滴的记录下来!

  [复制链接]

6

主题

68

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2011-12-17
在线时间
4 小时
发表于 2012-1-11 00:12:25 | 显示全部楼层 |阅读模式

虽然现在工作中主要使用的是51系列单片,看到STM32发展如此快,就买了一个板子开始学习,没有自己想的那么简单,只能下班回来学习,有时一个问题自己得琢磨好几晚上才解决,今晚猛然想,何不在一个论坛把自己遇到的问题写出来,看了一下几个论坛,最终绝地写在这个论坛上,学习STM32已经快半个月了,期间遇到好多问题,今晚就先写一下今晚碰到的问题,想到什么就写什么。
  1  对NVIC的理解
      CM3支持硬件中断嵌套,分为抢占式优先级和亚优先级,使用规则主要有,抢占优先级高级别的可以打断低级别的,同一级别的抢占优先级同时发生时,亚当优先级高的先发生中断,若是相同,则按硬件排列顺序发生。若是有一个亚优先级正在执行中断,同一级别的其它亚优先级发生时,则先挂起,等此中断执行完再执行!
     从库函数中找到优先级分组模式:
#define NVIC_PriorityGroup_0         ((uint32_t)0x700) /* 0 bits for pre-emption priority
                                                          4 bits for subpriority */
#define NVIC_PriorityGroup_1         ((uint32_t)0x600) /* 1 bits for pre-emption priority
                                                          3 bits for subpriority */
#define NVIC_PriorityGroup_2         ((uint32_t)0x500) /* 2 bits for pre-emption priority
                                                          2 bits for subpriority */
#define NVIC_PriorityGroup_3         ((uint32_t)0x400) /* 3 bits for pre-emption priority
                                                          1 bits for subpriority */
#define NVIC_PriorityGroup_4         ((uint32_t)0x300) /* 4 bits for pre-emption priority
                                                          0 bits for subpriority */
从中可以看出第一组只有一个级别,16个亚优先级,我可以这样理解,若是分配成这个组里,不能发生嵌套中断,同时发生中断时,亚优先级高的先发生,若有中断执行时,必须等中断执行完才能执行下一个中断。最后一组正好相反,有15个级别,若是执行一个中断,可以最多嵌套15个中断执行一个中断。看下面的例子:
  NVIC_InitTypeDef    NVIC_InitStructure;  //定义中断初始化类型结构体变量
  
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);   //配置优先级分组1 2个两个抢占优先级 8个亚优先级
  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //开口外部中断0
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//配置0号抢占式优先级 
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//亚优先级配置为0号
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道
  NVIC_Init(&NVIC_InitStructure);     //对外部中断0进行初始化配置

  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //开口外部中断5到9
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//配置1号抢占式优先级 
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//亚优先级配置为1号
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道
  NVIC_Init(&NVIC_InitStructure);     //对外部中断0进行初始化配置

  NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn; //ADC1中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//配置1号抢占式优先级 
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//亚优先级配置为1号
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道
  NVIC_Init(&NVIC_InitStructure);     //对外部中断0进行初始化配置

从上面的配置来看,外部中断0的优先级最高,可以打断ADC和外部5到9的中断,也就说可以嵌套发生,当ADC中断和外部5到9中断同时发生时,它们的抢占优先级别相同,亚优先级别也相同,因为ADC1硬件排在更靠前,则先发生ADC中断,若是两者任何一个中断正在执行,则等此中断执行完,再去执行另一个中断。

     今天晚上就先理解到这里,明天晚上继续。





与其相濡以沫,不如相望江湖!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

68

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2011-12-17
在线时间
4 小时
 楼主| 发表于 2012-1-12 16:21:49 | 显示全部楼层

上班闲着时,看了一下,事件与中断的关系,通过仔细分析和查资料,是不能混为一谈的,把找到的知识点分析如下:
  2  事件与中断
事件:是表示检测到某一动作(电平边沿)触发事件发生了。
中断:有某个事件发生并产生中断,并跳转到对应的中断处理程序中。
事件可以触发中断,也可以不触发
中断有可能被更优先的中断屏蔽,事件不会

事件本质上就是一个触发信号,是用来触发特定的外设模块或核心本身(唤醒).
事件只是一个触发信号(脉冲),而中断则是一个固定的电平信号


通过上图的表示,可以明显看出,蓝色是中断发生,红色是事件发生,从一到三两者线路是相同的,然后两者分开,上升沿和下降沿用来选择电平方式,中断和事件屏蔽寄存器起到相应的开关作用,软件中断/事件寄存器只要为1对后面的线路都有作用,挂起请求寄存器主要记录电平变化!先理解到这里!

与其相濡以沫,不如相望江湖!
回复 支持 4 反对 0

使用道具 举报

6

主题

68

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2011-12-17
在线时间
4 小时
 楼主| 发表于 2012-1-14 00:21:20 | 显示全部楼层
 刚开始使用SysTick这个滴答时,也没有仔细想它是怎么来的,只是照葫芦画瓢,若是做项目的话,用它来分配时间片最好,设定每个时间片用来干什么,轮询查看,这样才不耽误系统的时间。
   3 SysTick仔细探究
      首先看STM官方芯片资料,上面真正涉及到得很少,其中在系统时钟树有个简单的说明如下:



    手册如下说明: RCC通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(SysTick)的外部时钟。通过对SysTick控制与状态寄存器的设置,可选择上述时钟或Cortex(HCLK)时钟作为SysTick时钟。通过这句话,可以看出SysTick时钟的来源,从图上也可以详细的看出SysTick是经过8分频得来的,这样好理解了,我们在手册上再仔细找,很能找到一句话:系统嘀嗒校准值固定为9000,当系统嘀嗒时钟设定为9MHz(HCLK/8的最大值),产生1ms时间基准。简单的说,我们把SysTick设置为9000时,就能产生1ms时间基准,说的明白点就是一个中断信号。计算一下:
                   系统的晶振是8MHZ,PLL9倍频以后为8MHZ*9=72MHz,然后经过8分频为9MHZ,即给systick分配的时钟9MHz,接下来我们再计算,一个计数周期的时间为1/9000000S, 这样写更容易明白点,我要计时1ms的话,即1/1000s的时间,(1/1000)/(1/9000000)=9000,可以看出我们要计时1ms的话设置为9000是这样得来的。其实上面的公式自己可以推导一下,设系统的时钟频率为SystemFrequency,我们要给滴答定时器设置的值为SystemFrequency / (1/时间基准)。例如1ms的设置72000000 / (1/0.001S)=9000.通过这里我们可以很容易的分配时间。注意设置的时候不要超过24位的最大值0xffffff.
            其中在库中有专门的配置函数如下:
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if (ticks > SYSTICK_MAXCOUNT)  return (1);                                                /* Reload value impossible */

  SysTick->LOAD  =  (ticks & SYSTICK_MAXCOUNT) - 1;                                         /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);                               /* set Priority for Cortex-M0 System Interrupts */
  SysTick->VAL   =  (0x00);                                                                 /* Load the SysTick Counter Value */
  SysTick->CTRL = (1 << SYSTICK_CLKSOURCE) | (1<<SYSTICK_ENABLE) | (1<<SYSTICK_TICKINT);    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                                               /* Function successful */
}   看这个函数就很好理解,配置好要基准的时间,就等中断发生吧。
void SysTick_Handler(void)
{
 }在中断函数,我们可以划分时间片,不要使CPU空等待.也就是到达你想要的那个时间就执行你想做的动作,主要不超出时间片得时间就行。今晚就先总结到这里,简单的知识写出来容易理解一些,反复来回进度有点慢了
  

与其相濡以沫,不如相望江湖!
回复 支持 2 反对 0

使用道具 举报

6

主题

68

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2011-12-17
在线时间
4 小时
 楼主| 发表于 2012-1-16 11:47:52 | 显示全部楼层

    我们在学STM32的时候函数assert_param出现的几率非常大,上网搜索一下,网上一般解释断言机制,做为程序开发调试阶段时使用。下面我就谈一下我对这些应用的看法,学习东西抱着知其然也要知其所以然。
   4  断言机制函数assert_param
      我们在分析库函数的时候,几乎每一个函数的原型有这个函数assert_param();下面以assert_param(IS_GPIO_ALL_PERIPH(GPIOx));为例说一下我的理解,函数的参数IS_GPIO_ALL_PERIPH(GPIOx),我们可以寻找到原型
     #define IS_GPIO_ALL_PERIPH(PERIPH) (((*(uint32_t*)&(PERIPH)) == GPIOA_BASE) || \
                                    ((*(uint32_t*)&(PERIPH)) == GPIOB_BASE) || \
                                    ((*(uint32_t*)&(PERIPH)) == GPIOC_BASE) || \
                                    ((*(uint32_t*)&(PERIPH)) == GPIOD_BASE) || \
                                    ((*(uint32_t*)&(PERIPH)) == GPIOE_BASE) || \
                                    ((*(uint32_t*)&(PERIPH)) == GPIOF_BASE) || \
                                    ((*(uint32_t*)&(PERIPH)) == GPIOG_BASE))
这个宏定义的作用就是检查参数PERIPH,判断参数PERIPH是否为GPIOX(A...G)基址中的一个,只要有一个为真则其值为真,否则为假,不用多说,这是C语言中基本的逻辑运算。当然这个库函数也用的很有意思,看:首先对PERIPH进行取址,也就是求地址,&ERIPH,然后对这个地址强制转化为32位的指针,即前面加(uint32_t *),然后通过*进行访问这个地址(指针)中的内容。不多说了,看几遍就能明白。
       下面我们再回到assert_param这个函数,这个函数是哪里的呢?在stm32f10x_conf.h寻找到原型如下:
#ifdef  USE_FULL_ASSERT

    #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
    void assert_failed(uint8_t* file, uint32_t line);
#else
    #define assert_param(expr) ((void)0)
#endif
这是一个预编译文件,若是定义了USE_FULL_ASSERT这个文件,则执行后面的文件,我们在程序中一般都没什么定义,即执行后面这个语句((void)0),这个语句不用多想,没有定义USE_FULL_ASSERT就是什么也不执行。说的明白点,对上面的那个语句IS_GPIO_ALL_PERIPH(GPIOx)不执行任何操作。
   若是定义了USE_FULL_ASSERT它,我们调用这个函数assert_param时,及对参数IS_GPIO_ALL_PERIPH(GPIOx)的正确性进行检查,通过一个C语言中的双目运算符来判断,若是返回1,执行语句(void)0,跟上面一样,若是返回0,则执行后面的函数assert_failed((uint8_t *)__FILE__, __LINE__),函数的作用在库函数中有解释,用来指示出错的行数和文件。注意:__FILE__, __LINE__是标准库函数中的宏定义!切记
void assert_failed(uint8_t* file, uint32_t line);刚开始没看明白为什么加在这里,仔细一想是在头文件的函数声明。至于函数实体呢?我们从官方文件的模板中main.c中可以找到。如下:
   void assert_failed(u8* file, u32 line)
{ /* User can add his own implementation to report the file name and line number,
   ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* Infinite loop */
while (1) { }
} 英文注释也说明了怎么应用,通过输入参数来确定位置,最简单的方法就是串口打印了,这个函数的主要思想是在输入参数有问题的时候,但是有编译不出来,它可以帮你检查参数的有效性,好处不必多言,自己领悟就行。
   继续说明如下: assert_param是怎样包含进去的呢?我们在stm32f10x_conf.h这个头文件中定义的函数声明还是宏定义,怎么在其它文件中都能应用呢?也很多网上朋友在刚开始学习的时候都遇到编译不过去的问题出现,最后通过在文件中添加USE_STDPERIPH_DRIVER来解决的

我们可以在整个工程中进行搜索USE_STDPERIPH_DRIVER,通过头文件可以看出,是使用标准外设文件。在stm32f10x.h文件中我们可以搜索到如下情况:
           #if !defined  USE_STDPERIPH_DRIVER
/**
 * @brief Comment the line below if you will not use the peripherals drivers.
   In this case, these drivers will not be included and the application code will
   be based on direct access to peripherals registers
   */
  #define USE_STDPERIPH_DRIVER
#endif

#ifdef USE_STDPERIPH_DRIVER
  #include "stm32f10x_conf.h"
#endif
可以很容易看出来,我们不在那里添加,这个头文件中也给我们设置了开关,只要把第一个的注释去掉,就不用在配置中添加USE_STDPERIPH_DRIVER了,在第二个文件中我们可以知道怎样包含这个控制开关文件了,呵呵。我们也明白为什么我们在写程序的时候只要包含stm32f10x.h就能很容易的包含所有的文件文件了吧,我们只要在stm32f10x_conf.h配置一下就能包含所需要的库文件了。
   通过以上可以看出,通过头文件的相互包含,来控制外设以及调试文件的调用,这样我们理清思路,理解起来就好多了。当然在学习中可能有些C语言问题还没有理解透彻,多上网搜一下,或者多看书,很快就搞明白的。


 

与其相濡以沫,不如相望江湖!
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-1-11 00:34:30 | 显示全部楼层
支持!
回复 支持 反对

使用道具 举报

12

主题

216

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2011-4-7
在线时间
3 小时
发表于 2012-1-11 16:07:04 | 显示全部楼层
库简单^_^
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-1-12 16:31:14 | 显示全部楼层
继续啊
回复 支持 反对

使用道具 举报

6

主题

68

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2011-12-17
在线时间
4 小时
 楼主| 发表于 2012-1-12 18:57:38 | 显示全部楼层
回复【5楼】正点原子:

---------------------------------
学到感觉理解费事的地方,理解后就写在这里!
与其相濡以沫,不如相望江湖!
回复 支持 反对

使用道具 举报

39

主题

597

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2115
金钱
2115
注册时间
2011-9-3
在线时间
121 小时
发表于 2012-1-13 00:05:06 | 显示全部楼层
回复【4楼】相识在天涯:
---------------------------------
不错,支持。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-1-14 10:43:55 | 显示全部楼层
cool.
希望楼主继续加油.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2012-1-6
在线时间
0 小时
发表于 2012-1-14 17:11:44 | 显示全部楼层
膜拜楼主!!!太牛逼了!!!
回复 支持 反对

使用道具 举报

19

主题

302

帖子

2

精华

高级会员

Rank: 4

积分
727
金钱
727
注册时间
2011-11-22
在线时间
10 小时
发表于 2012-1-14 19:12:07 | 显示全部楼层
楼主牛逼了
回复 支持 反对

使用道具 举报

6

主题

68

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2011-12-17
在线时间
4 小时
 楼主| 发表于 2012-1-16 10:26:56 | 显示全部楼层
回复【9楼】正点原子:

---------------------------------
谢谢!我会继续记录学习中遇到的难以理解地方,这样更能加深记忆。
回复【10楼】乌卡卡:

---------------------------------
回复【11楼】dzng11:

---------------------------------

一边学习,一边查资料,遇到不是很好理解的地方记录下来而已,估计很多人跟我一样也遇到同样的问题,共勉之!
与其相濡以沫,不如相望江湖!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-1-16 10:29:56 | 显示全部楼层
所谓好记心不如烂笔头.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2012-1-10
在线时间
0 小时
发表于 2012-1-16 13:39:19 | 显示全部楼层
楼主继续!
回复 支持 反对

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2012-1-16 19:28:22 | 显示全部楼层
很给力
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-2-16
在线时间
0 小时
发表于 2012-2-16 22:49:19 | 显示全部楼层
内容挺细致!希望继续
回复 支持 反对

使用道具 举报

8

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2011-7-17
在线时间
0 小时
发表于 2012-3-6 21:38:40 | 显示全部楼层
楼主大神了。。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2012-3-7
在线时间
0 小时
发表于 2012-3-7 14:11:12 | 显示全部楼层
楼主很漂亮,
回复 支持 反对

使用道具 举报

11

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2012-2-17
在线时间
0 小时
发表于 2012-3-7 15:17:38 | 显示全部楼层
断言机制,共勉之
那些年,我们一起走过的日子...
回复 支持 反对

使用道具 举报

6

主题

68

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2011-12-17
在线时间
4 小时
 楼主| 发表于 2012-3-7 21:27:57 | 显示全部楼层
回复【18楼】jcl9696:

---------------------------------
谢谢夸奖!我只是发表我对这个芯片功能的看法,有错误的地方指出来就行。
回复【20楼】成可风:
断言机制若是仔细研究的话,还有很多地方需要说明,我只是发表一下在STM32在库函数中的应用方式,在实际中我们却应用的很少,要么我写的程序还很小,或者你写程序很仔细那就另外了。
 
    好久没有写了,工作一直挺忙,太累。现在在研究定时器,等把定时器搞完,再写一下学习心得共勉吧!~学习这些我不管操作定时器还是库函数,主要的是明白它的工作原理,说白了,要明白这个内核的单片机。以后再出什么系列的都不怕!

与其相濡以沫,不如相望江湖!
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2012-3-8
在线时间
0 小时
发表于 2012-3-9 09:33:19 | 显示全部楼层
加油
回复 支持 反对

使用道具 举报

2

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-4-15
在线时间
0 小时
发表于 2012-4-26 21:38:47 | 显示全部楼层
楼主的表现很好啊,你用的是库吧 
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2012-6-26
在线时间
0 小时
发表于 2012-6-27 12:40:52 | 显示全部楼层
楼主太神了!
回复 支持 反对

使用道具 举报

53

主题

324

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2012-6-18
在线时间
7 小时
发表于 2012-6-30 09:44:59 | 显示全部楼层
学习
回复 支持 反对

使用道具 举报

18

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2012-6-20
在线时间
100 小时
发表于 2012-6-30 14:14:33 | 显示全部楼层
读了楼主关于中断笔记,茅塞顿开!
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2012-7-25
在线时间
0 小时
发表于 2012-8-1 15:38:26 | 显示全部楼层
好贴要顶,共同分享经验~~请问一下lz 对于使用keil4 的理解 其中,build 同rebuilt 之间有什么区别呢??都能产生hex 文件,会对虚拟仿真文件.axf 有影响吗????
人的梦想,是不会终结噶!!!!
回复 支持 反对

使用道具 举报

6

主题

68

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2011-12-17
在线时间
4 小时
 楼主| 发表于 2012-8-1 21:16:19 | 显示全部楼层
回复【27楼】AB绝对LY:
---------------------------------
个人简单理解:build:只是重新编译“修改过的”文件,然后把所有的目标文件重新连接生成hex文件。若是没有修改过的文件,只是把文件重新链接生成目标文件。
             rebuilt:工程中的所有文件重新编译,重新链接生成目标文件。花费时间较长。在调试程序中没有必要。
个人感觉两者生成的文件对虚拟仿真没有影响.
与其相濡以沫,不如相望江湖!
回复 支持 反对

使用道具 举报

6

主题

68

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2011-12-17
在线时间
4 小时
 楼主| 发表于 2012-8-1 21:18:43 | 显示全部楼层
回复【23楼】gongkansb:
---------------------------------
个人感觉用什么都一样,关键看你怎么学,怎么去理解内核结构和外设。实质都是操作寄存器,去理解工作原理。
与其相濡以沫,不如相望江湖!
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2012-7-25
在线时间
0 小时
发表于 2012-8-2 00:22:06 | 显示全部楼层
回复【28楼】相识在天涯:
---------------------------------
恩恩,多谢lz rebuilt 时间比较长,明白了,谢谢
人的梦想,是不会终结噶!!!!
回复 支持 反对

使用道具 举报

4

主题

9

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2012-7-31
在线时间
0 小时
发表于 2012-8-3 17:19:42 | 显示全部楼层
好贴,受教了~~~
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2012-8-5
在线时间
2 小时
发表于 2012-8-5 15:30:45 | 显示全部楼层
期待楼主的更新啊
回复 支持 反对

使用道具 举报

5

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2012-7-28
在线时间
6 小时
发表于 2012-8-5 22:35:42 | 显示全部楼层
学习ing ~~
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2012-8-6
在线时间
2 小时
发表于 2012-8-6 17:07:46 | 显示全部楼层
学习之 共勉之
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2012-7-27
在线时间
0 小时
发表于 2012-8-7 17:13:02 | 显示全部楼层
楼主好强大!!!!想入门STM32的菜鸟求指点!!
装孙子俗称社交!!!!
回复 支持 反对

使用道具 举报

21

主题

123

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
金钱
355
注册时间
2012-3-11
在线时间
49 小时
发表于 2012-9-9 21:25:01 | 显示全部楼层
楼主辛苦了,好贴!学到不少东西,顶一下!期待定时器。。。。
这辈子只会两件事:这也不会,那也不会!
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2012-8-11
在线时间
0 小时
发表于 2012-9-10 22:07:32 | 显示全部楼层
回复【29楼】相识在天涯:
---------------------------------
其实我觉得如果一开始用库的话,要记下他定义好的各种函数和常量,学起来比直接操作寄存器还要费劲许多,只有学会直接寄存器了,然后用库函数才很快很方便。个人理解,因为以前吃过这个亏,后来看原子的书才进步得快一点
回复 支持 反对

使用道具 举报

64

主题

227

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-7-23
在线时间
13 小时
发表于 2012-9-11 16:00:53 | 显示全部楼层
半个月就学成这样了,神人
回复 支持 反对

使用道具 举报

32

主题

300

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2012-3-30
在线时间
321 小时
发表于 2012-9-12 21:09:34 | 显示全部楼层
学一点记一点确实很好
否则容易忘记
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2012-10-12
在线时间
2 小时
发表于 2012-10-12 21:23:33 | 显示全部楼层
谢谢分享!!!
全力以赴!
回复 支持 反对

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2012-10-2
在线时间
0 小时
发表于 2012-10-13 01:15:24 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

3

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2011-5-10
在线时间
5 小时
发表于 2012-10-15 14:04:06 | 显示全部楼层
继续呀,楼主
回复 支持 反对

使用道具 举报

1

主题

25

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-9-21
在线时间
0 小时
发表于 2012-10-18 14:17:07 | 显示全部楼层
楼主,非常感谢你的分享,最近潜水啦?嘿嘿。
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2012-10-16
在线时间
1 小时
发表于 2012-10-30 10:00:09 | 显示全部楼层
回复【14楼】相识在天涯:
---------------------------------
看了你对断言机制的理解,我之前找过,但是如果按照原子开发板给的例子来说,他找不到void assert_failed(uint8_t* file, uint32_t line)这个函数的原型 
所以在他所有的例子里面  这个基本上是没有用的!
回复 支持 反对

使用道具 举报

6

主题

68

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2011-12-17
在线时间
4 小时
 楼主| 发表于 2012-10-30 12:24:46 | 显示全部楼层
回复【44楼】372020552:

回复【14楼】相识在天涯:
---------------------------------
看了你对断言机制的理解,我之前找过,但是如果按照原子开发板给的例子来说,他找不到void assert_failed(uint8_t* file, uint32_t line)这个函数的原型 
所以在他所有的例子里面  这个基本上是没有用的!

---------------------------------
这是对STM官方库应用的理解,与原子开发板例程没有关系,你根本没有体会到到断言机制的用处,断言机制在编程中有很多妙用,慢慢琢磨吧!
与其相濡以沫,不如相望江湖!
回复 支持 反对

使用道具 举报

14

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-8-21
在线时间
29 小时
发表于 2012-11-16 15:24:49 | 显示全部楼层
厉害
回复 支持 反对

使用道具 举报

11

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2012-10-12
在线时间
3 小时
发表于 2012-11-16 17:22:41 | 显示全部楼层
。。。我去,断言机制完全没懂。。。
新人求指导~~~
回复 支持 反对

使用道具 举报

22

主题

436

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2012-8-6
在线时间
2 小时
发表于 2012-11-16 19:33:39 | 显示全部楼层
每钕 怎么不更新了?
往事随风!
回复 支持 反对

使用道具 举报

13

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2012-11-17
在线时间
18 小时
发表于 2012-11-17 16:40:37 | 显示全部楼层
学习了,谢谢楼主的分享,看后学到很多。原来自己理解的很肤浅!!

回复 支持 反对

使用道具 举报

51

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
561
金钱
561
注册时间
2011-4-11
在线时间
43 小时
发表于 2012-11-17 16:48:21 | 显示全部楼层
给了   楼主理解的真是深透呀
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-22 21:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表