打印

更新:Firmware Lib在EK_STM32F上的学习体会(CAN/Cortex/Debug)

[复制链接]
3871|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
barboon|  楼主 | 2008-2-1 13:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
接着下面链接的内容继续更新,点击察看说明以及ADC和BKP的例子

通过Firmware Lib在EK_STM32F上的学习体会



bxCAN exemple1:

这个例子展示了如何使用STM32的BxCAN模块来收发数据。在本例中,BxCAN模块工作在loopback模式下,即从接收端接收从发射段发出的数据,实现自发自收。运行程序以后,首先,模块将以100Kbit/s的波特率传输一帧标准数据。等待传输完成以后,在接受段接收并核对这帧数据,根据结果判断传输正确与否并亮起相应的LED。

随后,模块将以500Kbit/s的波特率传输一帧扩展数据,这次,接受端在收到收据以后,将产生一个中断,在中断中核对这帧数据。也根据结果判断传输正确与否并亮起相应的LED。

对于EKSTM32F,由于4个LED分别被连接在管脚PC.04 – PC.07,而在STM32-EVALB上,4个LED连接在PC.06 – PC.09。我们对上述程序只需要作相应的改动即可。

运行程序,我们发现版上LD5和LD4亮起,这标志着2次传输都成功。

-----------------------我是分隔线-----------------------------------

CortexM3 exemple1

本例示范了如何利用STM32的CortexM3内核的Bit-Band访问功能来实现对SRAM中的某个变量进行单个比特的读写修改操作。

对位于SRAM内Bit-Band的字进行操作(取值0x00或者0x01),等同于对目标变量的相应位进行同样的操作。
对应公式如下:
bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number x 4)

例如:0x23FFFFFC = 0x22000000 + (0xFFFFF*32) + 7*4
对0x23FFFFFC进行操作,等同于对位于0x200FFFFC的变量第7位进行操作。


CortexM3 exemple2

本例示范了如何修改Cortex-M3内核在Thread模式下,如何修改:
1. 将默认堆栈由main stack改为Process stack
2. 将权限由优先(Privileged)改为非优先(Unprivileged or User)
3. 将权限由非优先(Unprivileged or User)改为优先(Privileged)


-----------------------我也是分隔线---------------------------------

Debug exemple1

只有在文件stm32f10x_conf.h中定义了标签DEBUG,用户才能进入DEBUG模式。一旦定义了这个标签,程序将生成一个指向SRAM中外设结构的指针。因此我们可以简化除错过程,并且获得所有寄存器的状态。

当用户选择DEBUG模式,宏assert_param被扩展,同时运行时间检查功能也在固态函数库代码中被激活。运行时间检查功能能够检查固件函数库中所有功能函数的输入是否是正确的。

进入DEBUG模式会增加代码的大小,降低代码的运行效率。因此,我们强烈建议仅仅在除错的时候使用相应代码,在最终的应用程序中,删除它们。

在本例中,我们在程序中故意将不正确的参数赋予了某固件函数库函数。通过USART1,错误源可以显示在PC的超级终端(Hyperterminal)上。


由于Cortex和Debug的例程都不需要改动,仅提供bxCAN的例程下载:
相关链接:https://bbs.21ic.com/upfiles/img/20082/200821134818646.zip
沙发
starm| | 2008-3-14 14:39 | 只看该作者

模块将以100Kbit/s的波特率传输一帧标准数据

void RCC_Configuration(void)
{
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();

  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1); 

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* Select HSE as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);

    /* Wait till HSE is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x04)
    {
    }
  }

TestStatus CAN_Polling(void)
{
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  CanTxMsg TxMessage;
  CanRxMsg RxMessage;
  u32 i = 0;
  u8 TransmitMailbox;

  /* CAN register init */
  CAN_DeInit();
  CAN_StructInit(&CAN_InitStructure);

  /* CAN cell init */
  CAN_InitStructure.CAN_TTCM=DISABLE;
  CAN_InitStructure.CAN_ABOM=DISABLE;
  CAN_InitStructure.CAN_AWUM=DISABLE;
  CAN_InitStructure.CAN_NART=DISABLE;
  CAN_InitStructure.CAN_RFLM=DISABLE;
  CAN_InitStructure.CAN_TXFP=DISABLE;
  CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
  CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
  CAN_InitStructure.CAN_Prescaler=5;
  CAN_Init(&CAN_InitStructure);

现在CANBus 是工作在 100 KBPS 吗?

如果是的话,那么中断方式是在 500 kbps 了。

TestStatus CAN_Interrupt(void)
{
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  CanTxMsg TxMessage;
  u32 i = 0;

  /* CAN register init */
  CAN_DeInit();
  CAN_StructInit(&CAN_InitStructure);

  /* CAN cell init */
  CAN_InitStructure.CAN_TTCM=DISABLE;
  CAN_InitStructure.CAN_ABOM=DISABLE;
  CAN_InitStructure.CAN_AWUM=DISABLE;
  CAN_InitStructure.CAN_NART=DISABLE;
  CAN_InitStructure.CAN_RFLM=DISABLE;
  CAN_InitStructure.CAN_TXFP=DISABLE;
  CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
  CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
  CAN_InitStructure.CAN_Prescaler=1;
  CAN_Init(&CAN_InitStructure);



使用特权

评论回复
板凳
barboon|  楼主 | 2008-3-14 17:38 | 只看该作者

回2楼

对的,楼上用黑体标出的语句,正是设置了传输的波特率,
见reference manuel: P302

BRP[9:0]: Baud Rate Prescaler
These bits define the length of a time quanta.
tq = (BRP[9:0]+1) x tPCLK

使用特权

评论回复
地板
wanghucumt| | 2008-6-18 17:09 | 只看该作者

Normal模式呢?

这个例程是Loopback模式的,用normal模式进行双机通信要怎么设置啊?有哥们做成功的吗,发来看看,我的双机连不上。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

143

主题

223

帖子

0

粉丝