找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2017|回复: 3
打印 上一主题 下一主题
收起左侧

角度测量的stm32源程序

[复制链接]
跳转到指定楼层
楼主
ID:388354 发表于 2018-8-21 00:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个测量空间角度的加速度器的例程
文件说明:
    project.eww :Workspace Data 工作空间
    project.ewd :Debugger Data. 调试器数据
    project.ewp : IAR Project 项目文件
        上面3个文件IAR系统的工程配置文件

    stm32f10x_flash.icf :     这个文件是IAR连接器配置文件。配置程序段(只读)在CPU内部Flash
                         数据段(可读写的,堆和栈)在CPU内部RAM。你可以根据自己需要进行修改。

    stm32f10x_ram.icf   : 这个文件是IAR连接器配置文件。配置程序段(只读)和数据段(可读写的,堆和栈)
                都在CPU内部RAM。你可以根据自己需要进行修改。

    cpu_ram.mac : 在CPU内部RAM调试时的宏文件, 包含修改中断向量表的代码
    ext_sram    : 在CPU内部RAM调试时的宏文件, 包含配置FSMC总线和修改中断向量表的代码

使用方法:
    (1) 双击 Project.eww,启动IAR开发环境
    (2) 重新编译连接所有文件: Project->Rebuild all
    (3) 装载镜像 : Project->Debug
    (4) 运行程序 :Debug->Go(F5)


单片机源程序如下:
  1. #include "stm32f10x.h"         
  2. #include <stdio.h>
  3. #include "usart_printf.h"

  4. #define RCC_APB2Periph_GPIO_CAN    RCC_APB2Periph_GPIOB
  5. #define GPIO_Remap_CAN             GPIO_Remap1_CAN1
  6. #define GPIO_CAN                   GPIOB
  7. #define GPIO_Pin_CAN_RX            GPIO_Pin_8
  8. #define GPIO_Pin_CAN_TX            GPIO_Pin_9

  9. typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;

  10. /* Private define ------------------------------------------------------------*/
  11. /* Private macro -------------------------------------------------------------*/
  12. /* Private variables ---------------------------------------------------------*/
  13. __IO uint32_t ret = 0; /* for return of the interrupt handling */
  14. volatile TestStatus TestRx;

  15. /* Private function prototypes -----------------------------------------------*/
  16. void NVIC_Configuration(void);
  17. TestStatus CAN_Polling(void);
  18. TestStatus CAN_Interrupt(void);
  19. void RCC_Configuration(void);
  20. void GPIO_Configuration(void);

  21. int main(void)
  22. {       
  23.         /* Setup STM32 system (clock, PLL and Flash configuration) */
  24.         SystemInit();
  25.         /* CAN1 Periph clock enable */
  26.         RCC_Configuration();
  27.         USART_Configuration();/* 配置串口 */
  28.         GPIO_Configuration();
  29.         /* NVIC Configuration */
  30.         NVIC_Configuration();

  31.         /* CAN transmit at 100Kb/s and receive by polling in loopback mode */
  32.         TestRx = CAN_Polling();       

  33.         while (1) ;
  34.         {
  35.         }
  36.                
  37. }

  38. void RCC_Configuration(void)
  39. {
  40.   /* GPIO clock enable */
  41.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO |RCC_APB2Periph_GPIO_CAN, ENABLE);

  42.   /* CAN1 Periph clock enable */
  43.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

  44. }

  45. void GPIO_Configuration(void)
  46. {
  47.   GPIO_InitTypeDef  GPIO_InitStructure;

  48.   /* Configure CAN pin: RX */
  49.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_CAN_RX;
  50.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  51.   GPIO_Init(GPIO_CAN, &GPIO_InitStructure);

  52.   /* Configure CAN pin: TX */
  53.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_CAN_TX;
  54.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  55.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  56.   GPIO_Init(GPIO_CAN, &GPIO_InitStructure);

  57.   GPIO_PinRemapConfig(GPIO_Remap_CAN , ENABLE);
  58. }

  59. TestStatus CAN_Polling(void)
  60. {
  61.   CAN_InitTypeDef        CAN_InitStructure;
  62.   CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  63.   CanTxMsg TxMessage;
  64.   CanRxMsg RxMessage;
  65.   uint32_t i = 0;
  66.   uint8_t TransmitMailbox = 0;

  67.   /* CAN register init */
  68.   CAN_DeInit(CAN1);
  69.   CAN_StructInit(&CAN_InitStructure);

  70.   /* CAN cell init */
  71.   CAN_InitStructure.CAN_TTCM=DISABLE;
  72.   CAN_InitStructure.CAN_ABOM=DISABLE;
  73.   CAN_InitStructure.CAN_AWUM=DISABLE;
  74.   CAN_InitStructure.CAN_NART=DISABLE;
  75.   CAN_InitStructure.CAN_RFLM=DISABLE;
  76.   CAN_InitStructure.CAN_TXFP=DISABLE;

  77.   CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;
  78.   //CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;

  79.   CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  80.   CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
  81.   CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
  82.   CAN_InitStructure.CAN_Prescaler=5;
  83.   CAN_Init(CAN1, &CAN_InitStructure);

  84.   /* CAN filter init */
  85.   CAN_FilterInitStructure.CAN_FilterNumber=0;
  86.   CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
  87.   CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  88.   CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
  89.   CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
  90.   CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
  91.   CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  92.   CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;
  93.   CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  94.   CAN_FilterInit(&CAN_FilterInitStructure);

  95.   /* transmit */
  96.   TxMessage.StdId=0x11;
  97.   TxMessage.RTR=CAN_RTR_DATA;
  98.   TxMessage.IDE=CAN_ID_STD;
  99.   TxMessage.DLC=2;
  100.   TxMessage.Data[0]=0xCA;
  101.   TxMessage.Data[1]=0xFE;

  102.   TransmitMailbox=CAN_Transmit(CAN1, &TxMessage);
  103.   i = 0;
  104.   while((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK) && (i != 0xFF))
  105.   {
  106.     i++;
  107.   }

  108.   i = 0;
  109.   while((CAN_MessagePending(CAN1, CAN_FIFO0) < 1) && (i != 0xFF))
  110.   {
  111.     i++;
  112.   }

  113.   /* receive */
  114.   RxMessage.StdId=0x00;
  115.   RxMessage.IDE=CAN_ID_STD;
  116.   RxMessage.DLC=0;
  117.   RxMessage.Data[0]=0x00;
  118.   RxMessage.Data[1]=0x00;
  119.   CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);

  120.   if (RxMessage.StdId!=0x11)
  121.   {
  122.     return FAILED;
  123.   }

  124.   if (RxMessage.IDE!=CAN_ID_STD)
  125.   {
  126.     return FAILED;
  127.   }

  128.   if (RxMessage.DLC!=2)
  129.   {
  130.     return FAILED;
  131.   }

  132.   if ((RxMessage.Data[0]<<8|RxMessage.Data[1])!=0xCAFE)
  133.   {
  134.     return FAILED;
  135.   }

  136.   return PASSED; /* Test Passed */
  137. }

  138. TestStatus CAN_Interrupt(void)
  139. {
  140.   CAN_InitTypeDef        CAN_InitStructure;
  141.   CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  142.   CanTxMsg TxMessage;
  143.   uint32_t i = 0;

  144.   /* CAN register init */
  145.   CAN_DeInit(CAN1);
  146.   CAN_StructInit(&CAN_InitStructure);

  147.   /* CAN cell init */
  148.   CAN_InitStructure.CAN_TTCM=DISABLE;
  149.   CAN_InitStructure.CAN_ABOM=DISABLE;
  150.   CAN_InitStructure.CAN_AWUM=DISABLE;
  151.   CAN_InitStructure.CAN_NART=DISABLE;
  152.   CAN_InitStructure.CAN_RFLM=DISABLE;
  153.   CAN_InitStructure.CAN_TXFP=DISABLE;
  154.   CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;
  155.   CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  156.   CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
  157.   CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
  158.   CAN_InitStructure.CAN_Prescaler=1;
  159.   CAN_Init(CAN1, &CAN_InitStructure);

  160.   /* CAN filter init */
  161.   CAN_FilterInitStructure.CAN_FilterNumber=1;
  162.   CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
  163.   CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  164.   CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
  165.   CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
  166.   CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
  167.   CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  168.   CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
  169.   CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  170.   CAN_FilterInit(&CAN_FilterInitStructure);

  171.   /* CAN FIFO0 message pending interrupt enable */
  172.   CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);

  173.   /* transmit 1 message */
  174.   TxMessage.StdId=0x00;
  175.   TxMessage.ExtId=0x1234;
  176.   TxMessage.IDE=CAN_ID_EXT;
  177.   TxMessage.RTR=CAN_RTR_DATA;
  178.   TxMessage.DLC=2;
  179.   TxMessage.Data[0]=0xDE;
  180.   TxMessage.Data[1]=0xCA;
  181.   CAN_Transmit(CAN1, &TxMessage);

  182.   /* initialize the value that will be returned */
  183.   ret = 0xFF;

  184.   /* receive message with interrupt handling */
  185.   i=0;
  186.   while((ret == 0xFF) && (i < 0xFFF))
  187.   {
  188.     i++;
  189.   }

  190.   if (i == 0xFFF)
  191. ……………………

  192. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
Goniometer_code.rar (480.75 KB, 下载次数: 12)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-8-21 01:58 | 只看该作者
需要补全原理图与传感器类型后即可获得100黑币
回复

使用道具 举报

板凳
ID:388392 发表于 2018-8-21 13:43 | 只看该作者
谢谢分享谢谢分享
回复

使用道具 举报

地板
ID:64583 发表于 2018-8-21 14:23 | 只看该作者
能说说原理吗?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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