你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

陈酿!四年陈的STM32F103外设测试代码!希望对你有帮助~~~ 精华  

[复制链接]
Dylan疾风闪电 发布时间:2016-1-7 14:26
一、前言
  今天在论坛上看到有人在讨论STM32睡眠模式的唤醒,一时兴起,就开始打扫“仓库”了。
结果扫出很多“旧货”,拿来分享给刚接触STM32的新人们!希望对你的学习有所帮助~~~


二、目录           

  所有代码的功能使用和描述,均在头文件开头的注释中!(通过点击楼层,直接跳转到目标代码)
注:所有代码均是在例程上改版而来的,所以嵌入自己的程序前需要验证!所有资料都是2012年的,所以部分描述对现有版本不适用!
1)楼层#2
3ADCs_DMA.h  ADC1,2,3:独立模式、单通道、连续转换
  ADC1:通过 DMA1_Channel1 将数据存入 ADC1ConvertedValue 变量地址
  ADC2:用中断 ADC1_2_IRQn 将数据存入 ADC2ConvertedValue 变量
  ADC3:通过 DMA2_Channel5 将数据存入 ADC3ConvertedValue 变量地址
2)楼层#3:ADC_AnalogWatchdog.h
  ADC1:独立模式、单通道、连续转换
  如果ADC转换的模拟电压 超出阀值范围,SR的AWD置1可产生中断.
  阀值位于ADC_HTR和ADC_LTR寄存器的最低12个有效位中.
  阀值独立于由ADC_CR2寄存器上的ALIGN位选择的数据对齐模式.  比较是在对齐之前完成的.
3)楼层#4:ADC_RegSimulDualMode.h
  ADC1,2:双ADC同步规则模式
  注意1: 不要在2个ADC上转换相同的通道(如果转换两个ADC的相同通道,不可能提供重叠的采样时间)。
  注意2: ADC2的外部触发必须使能,否则只能采集一个数据。
4)楼层#5:ADC_TIMTrigAutoInjection.h  
  ADC1:独立模式、单通道、单次转换、外部触发、自动注入
  自动注入 如果设置了JAUTO位,在规则组通道之后,注入组通道被自动转换。
5)楼层#6:BKP_Tamper.h
  BKP:保存VBAT掉电前的数据
  当TAMPER引脚上的信号从’0’变成’1’或者从’1’变成’0’
  (取决于备份控制寄存器BKP_CR的TPAL位),BKP_TamperPinLevelConfig(BKP_TamperPinLevel_Low);//设置侵入检测管脚的有效电平
  会产生一个侵入检测事件。
  侵入检测事件将所有数据备份寄存器内容清除。
  在一个侵入事件被检测到并被清除后,侵入检测引脚TAMPER应该被禁止。
  然后,在再次写入备份数据寄存器前重新用TPE位启动侵入检测功能。
  这样,可以阻止软件在侵入检测引脚上仍然有侵入事件时对备份数据寄存器进行写操作。这相当于对侵入引脚TAMPER进行电平检测。
6)楼层#7:CAN_Example.h
  收发寄存器 RDLR,RDHR,TDLR,TDHR
  例如 CANx->sFIFOMailBox[FIFONumber].RDLR;
7)楼层#9:CM3_BitBand.h  
  CM3:BitBand(别名区域)
  use CortexM3 Bit-Band access to perform atomic read-modify-write and read operations on a varaible in SRAM.
  对Bit-band区域某个字节的写操作,Cortex-M3都将自动转换成对相对应比特位的读-修改-写操作。
  对Bit-band区域某个字节的读操作则将转换成相对应比特位的读操作。
  公式:Bit-Band地址= Bit-Band域首地址 + (操作字节的偏移量× 32) + (操作位的偏移量× 4)
                    = Bit-Band域首地址 | (操作字节的偏移量<<5) | (操作位的偏移量<<2)
  内置SRAM区的Bit-Band域首地址为0x22000000
  外设寄存器区的Bit-Band域首地址为0x42000000
8)楼层#10:CM3_ModePrivilege.h
  CM3:特殊模式 (此例未验证成功:__set_PSP()等宏未定义)
  阀值独立于由ADC_CR2寄存器上的ALIGN位选择的数据对齐模式.  比较是在对齐之前完成的.
9)楼层#11:CRC_Example.h
  CRC:以多项式(0x4C11DB7)进行CRC计算得到一个32位的值
10)楼层#12:DAC_2ChTriangleWave.h  
   DAC:使用不同三角波发生器的同时触发
11)楼层#13:DAC_DMAEscalator.h
  DAC:DMA输出梯形波
12)楼层#14:DAC_DualModeDMASineWave.h
  DAC:双DAC通道转换
  DAC集成了3个供双DAC模式使用的寄存器:DHR8RD、DHR12RD和DHR12LD,
  只需要访问一个寄存器即可完成同时驱动2个DAC通道的操作。
13)楼层#15:DAC_NoiseWave.h
  DAC:噪声生成
  可以利用线性反馈移位寄存器(Linear Feedback Shift Register LFSR)产生幅度变化的伪噪声。
14)楼层#16:DEBUG.h
  printf("...");
15)楼层#17:DMA_ADC_TIM1.h
  DMA:通过DMA将ADC采样 反映为TIM1_CH1的脉冲频率(CCR1)
16)楼层#18:DMA_FlashRAM.h
  DMA:从ROM中拷贝数组常量到RAM中 (存在弊端,不复位的情况下可能 FAILED)
17)楼层#19:DMA_FSMC.h
  DMA:通过2个DMA通道,
  将32位数据SRC_Const_Buffer[]从FLASH_ROM写入外设FSMC的SRAM,
  然后从外设FSMC的SRAM以8位DST_Buffer[]逐个读取数据存入 (存在弊端,不复位的情况下可能 卡while)
18)楼层#20:EXTI_Example.h
  EXTI:按下PB10(Key4) 翻转绿灯(PF6)上的电平
19)楼层#21:FLASH_Program.h
  FLASH:擦写数据到FLASH地址
20)楼层#22:FLASH_WriteProtection.h
  FLASH:写保护(写保护部分存在问题,无法设置保护)
21)楼层#23:FSMC_NAND.h
  FSMC:(未研究)
22)楼层#24:I2C_M24C02EEPROM.h
  I2C:(ST的I2C问题很多,建议不用,选择IO口模拟)--测试不通过,待调整。《申明:这里只是上传老的资料,描述也是以前的。故对存在问题的代码也不进行优化!》
23)楼层#25:IWDG_Example.h
  IWDG:The IWDG timeout is set to 280 ms,Systick Interrupt is 250ms
  黄灯闪烁,表示每250ms喂狗一次
  亮绿灯,表示系统已经由IWDG复位,resumed from IWDG reset
  按下Keyer4 进入EXTI中断,关闭Systick,使IWDG不能喂狗,系统复位
24)楼层#26:NVIC_CM3LPModes.h
  NVIC:低功耗
25)楼层#27:PWR_STANDBY.h
  PWR:待机模式
26)楼层#28:PWR_STOP.h
  PWR:停机模式
27)楼层#29:SPI_Example.h
  无.


三、结语
         
  为了便于大家阅读,所以将代码片段上传。
  可以按照每个示例中的“实例应用步骤:”直接复制粘贴,一步到位的进行测试,测试结果也在“4.Watch中观察”中写明。
  闲话不说,大家往下“看”吧!








收藏 22 评论60 发布时间:2016-1-7 14:26

举报

60个回答
Dylan疾风闪电 回答时间:2016-1-7 14:26:10
本帖最后由 Dylan疾风闪电 于 2016-1-8 11:20 编辑

为了大家学习、测试的便利,在这将IAR平台的工程文件打包上传。(文字描述部分不一定正确,毕竟是早期的个人理解。希望不要产生误导信息。) STM32F103ZE例子实施.rar (403.32 KB, 下载次数: 96)
Dylan疾风闪电 回答时间:2016-1-7 14:26:36
  1. /**
  2.   ******************************************************************************
  3.   * @file /ADC_AnalogWatchdog.h
  4.   * @author    xd.wu
  5.   * @version   V1.0
  6.   * @date     2012-4-12
  7.   * @brief    ADC1:独立模式、单通道、连续转换
  8.   如果ADC转换的模拟电压 超出阀值范围,SR的AWD置1可产生中断.
  9.   阀值位于ADC_HTR和ADC_LTR寄存器的最低12个有效位中.
  10.   阀值独立于由ADC_CR2寄存器上的ALIGN位选择的数据对齐模式.  比较是在对齐之前完成的.
  11.   ******************************************************************************
  12.   *用途:报警、指示灯
  13.   */
  14.   /*实例应用步骤:
  15.   //1."main.cpp"调用fmain()
  16.   
  17.   //2."stm32f10x_it.cpp"拷贝
  18.   void ADC1_2_IRQHandler(void)
  19.   {
  20.     GPIO_WriteBit(GPIO_LED, GPIO_Pin_6, Bit_SET);// Toggle LED
  21.     GPIO_WriteBit(GPIO_LED, GPIO_Pin_6, Bit_RESET);
  22.   
  23.     ADC_ClearITPendingBit(ADC1, ADC_IT_AWD);// Clear ADC1 AWD pending interrupt bit
  24.   }
  25.   
  26.   //3."stm32f10x_it.h"声明
  27.   void ADC1_2_IRQHandler(void);
  28.   
  29.   //4.Watch中观察
  30.   LED变化
  31.   */

  32. #ifndef __ADC_ANALOGWATCHDOG_H
  33. #define __ADC_ANALOGWATCHDOG_H
  34. /* Includes ------------------------------------------------------------------*/
  35. #include "std32periph.h"

  36. /* Private typedef -----------------------------------------------------------*/
  37. /* Private define ------------------------------------------------------------*/
  38. #define GPIO_LED      GPIOF
  39. #define RCC_LED       RCC_APB2Periph_GPIOF
  40. /* Private macro -------------------------------------------------------------*/
  41. /* Private variables ---------------------------------------------------------*/
  42. /* Private functions ---------------------------------------------------------*/

  43. void fmain(void)
  44. {
  45.   RCC_HSEConf(7);//56M

  46.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA | RCC_LED, ENABLE);
  47.   //复位ADC
  48.   RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1 , ENABLE);
  49.   RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1 , DISABLE);

  50.   GPIO_InitTypeDef GPIO_InitStructure;
  51.   /* Configure GOIO_LED pin 6 as output push-pull ----------------------------*/
  52.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  53.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  54.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  55.   GPIO_Init(GPIO_LED, &GPIO_InitStructure);
  56.   /* Configure PA.01 (ADC Channel1) as analog input --------------------------*/
  57.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  58.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  59.   GPIO_Init(GPIOA, &GPIO_InitStructure);

  60.   //NVIC for ADC1
  61.   NVIC_GroupSet(NVIC_PriorityGroup_0, ADC1_2_IRQn, 0);

  62.   ADC_InitTypeDef ADC_InitStructure;
  63.   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  64.   ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  65.   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  66.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  67.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  68.   ADC_InitStructure.ADC_NbrOfChannel = 1;
  69.   ADC_Init(ADC1, &ADC_InitStructure);
  70.   ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_13Cycles5);

  71.   //AnalogWatchdogThresholds 模拟看门狗高低阈yu值
  72.   ADC1->LTR = 0x0300;
  73.   ADC1->HTR = 0x0800;//0x0B00;//设成远大于实际波动的值0x0FF0;便不会超限了//
  74.   
  75.   ADC_AnalogWatchdogSingleChannelConfig(ADC1, ADC_Channel_1);  //本例重点设置:对单个ADC通道设置模拟看门狗
  76.   ADC_AnalogWatchdogCmd(ADC1, ADC_AnalogWatchdog_SingleRegEnable);
  77.   ADC_ITConfig(ADC1, ADC_IT_AWD, ENABLE);

  78.   ADC_Cmd(ADC1, ENABLE);
  79.   ADC_ResetCalibration(ADC1);
  80.   while(ADC_GetResetCalibrationStatus(ADC1));
  81.   ADC_StartCalibration(ADC1);
  82.   while(ADC_GetCalibrationStatus(ADC1));
  83.   
  84.   ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  85. }

  86. #endif
  87. /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
复制代码
Dylan疾风闪电 回答时间:2016-1-7 14:29:07
  1. /**
  2.   ******************************************************************************
  3.   * @file /ADC_RegSimulDualMode.h
  4.   * @author    xd.wu
  5.   * @version   V1.0
  6.   * @date     2012-4-12
  7.   * @brief    ADC1,2:双ADC同步规则模式
  8.   注意1: 不要在2个ADC上转换相同的通道(如果转换两个ADC的相同通道,不可能提供重叠的采样时间)。
  9.   注意2: ADC2的外部触发必须使能,否则只能采集一个数据。
  10.   ******************************************************************************
  11.   *用途:同步采样
  12.   */
  13.   /*实例应用步骤:
  14.   //1."main.cpp"调用fmain()
  15.   
  16.   //4.Watch中观察
  17.   LED变化
  18.   */

  19. #ifndef __ADC_REGSIMULDUALMODE_H
  20. #define __ADC_REGSIMULDUALMODE_H
  21. /* Includes ------------------------------------------------------------------*/
  22. #include "std32periph.h"

  23. /* Private typedef -----------------------------------------------------------*/
  24. /* Private define ------------------------------------------------------------*/
  25. /* Private macro -------------------------------------------------------------*/
  26. /* Private variables ---------------------------------------------------------*/
  27. vu32 ADC_DualConvertedValueTab[16];
  28. /* Private functions ---------------------------------------------------------*/

  29. void fmain(void)
  30. {
  31.   RCC_HSEConf(7);//56M

  32.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  33.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2 |
  34.                          RCC_APB2Periph_GPIOA, ENABLE);
  35.   //复位ADC
  36.   RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2 , ENABLE);
  37.   RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2 , DISABLE);

  38.   
  39.   /* PA.01,02,03,04(ADC Channel11,2,3,4) as analog input ---------------------*/
  40.   GPIO_InitTypeDef GPIO_InitStructure;
  41.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
  42.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  43.   GPIO_Init(GPIOA, &GPIO_InitStructure);


  44.   /* DMA1 channel1 configuration ----------------------------------------------*/
  45.   DMA_InitTypeDef   DMA_InitStructure;
  46.   DMA_InitStructure.DMA_PeripheralBaseAddr = ((u32)0x4001244C);//(u32)ADC1_DR_Address;
  47.   DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_DualConvertedValueTab;
  48.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  49.   DMA_InitStructure.DMA_BufferSize = 16;
  50.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  51.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  52.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  53.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  54.   DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  55.   DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  56.   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  57.   DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  58.   DMA_Cmd(DMA1_Channel1, ENABLE);

  59.   //ADC Public Setting
  60.   ADC_InitTypeDef   ADC_InitStructure;
  61.   ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;//本例重点:双ADC同步规则模式
  62.   ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  63.   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  64.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  65.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  66.   ADC_InitStructure.ADC_NbrOfChannel = 2;
  67.   /* ADC1 configuration ------------------------------------------------------*/
  68.   ADC_Init(ADC1, &ADC_InitStructure);
  69.   ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5);   
  70.   ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_239Cycles5);
  71.   ADC_DMACmd(ADC1, ENABLE);

  72.   /* ADC2 configuration ------------------------------------------------------*/
  73.   ADC_Init(ADC2, &ADC_InitStructure);
  74.   ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 1, ADC_SampleTime_239Cycles5);
  75.   ADC_RegularChannelConfig(ADC2, ADC_Channel_4, 2, ADC_SampleTime_239Cycles5);
  76.   ADC_ExternalTrigConvCmd(ADC2, ENABLE);

  77.   ADC_Cmd(ADC1, ENABLE);
  78.   /* Enable Vrefint channel17 */
  79.   ADC_TempSensorVrefintCmd(ENABLE);//启用温度传感器
  80.   ADC_ResetCalibration(ADC1);//重置校准寄存器
  81.   while(ADC_GetResetCalibrationStatus(ADC1));
  82.   ADC_StartCalibration(ADC1);
  83.   while(ADC_GetCalibrationStatus(ADC1));

  84.   /* Enable ADC2 */
  85.   ADC_Cmd(ADC2, ENABLE);
  86.   ADC_ResetCalibration(ADC2);
  87.   while(ADC_GetResetCalibrationStatus(ADC2));
  88.   ADC_StartCalibration(ADC2);
  89.   while(ADC_GetCalibrationStatus(ADC2));

  90.   ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  91.   while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));
  92.   DMA_ClearFlag(DMA1_FLAG_TC1);
  93. }

  94. #endif
  95. /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
复制代码
Dylan疾风闪电 回答时间:2016-1-7 14:53:45
  1. /**
  2.   ******************************************************************************
  3. * @file /ADC_TIMTrigAutoInjection.h  ##此程序有瑕疵:会进入HardFault_Handler中断,疑似程序执行过快跑飞
  4.   * @author    xd.wu
  5.   * @version   V1.0
  6.   * @date     2012-4-13
  7.   * @brief    ADC1:独立模式、单通道、单次转换、外部触发、自动注入
  8.   自动注入 如果设置了JAUTO位,在规则组通道之后,注入组通道被自动转换。
  9.   ******************************************************************************
  10.   *用途:滞后1个特定转换周期的连续转换
  11.   */
  12.   /*实例应用步骤:
  13.   //1."main.cpp"调用fmain()
  14.   
  15.   //2."stm32f10x_it.cpp"拷贝
  16.   extern vu16 ADC_InjectedConvertedValueTab[32];
  17.   vu32 Index;
  18.   void ADC1_2_IRQHandler(void)
  19.   {
  20.     GPIO_WriteBit(GPIOF, GPIO_Pin_6, Bit_SET);

  21.     ADC_InjectedConvertedValueTab[Index++] = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1);
  22.     ADC_ClearITPendingBit(ADC1, ADC_IT_JEOC);

  23.     GPIO_WriteBit(GPIOF, GPIO_Pin_6, Bit_RESET);
  24.   }
  25.   
  26.   //3."stm32f10x_it.h"声明
  27.   void ADC1_2_IRQHandler(void);
  28.   
  29.   //4.Watch中观察
  30.   LED
  31.   ADC_RegularConvertedValueTab
  32.   ADC_InjectedConvertedValueTab
  33.   */

  34. #ifndef __ADC_TIMTRIGAUTOINJECTION_H
  35. #define __ADC_TIMTRIGAUTOINJECTION_H
  36. /* Includes ------------------------------------------------------------------*/
  37. #include "std32periph.h"

  38. /* Private typedef -----------------------------------------------------------*/
  39. /* Private define ------------------------------------------------------------*/
  40. #define GPIO_LED      GPIOF
  41. #define RCC_LED       RCC_APB2Periph_GPIOF
  42. /* Private macro -------------------------------------------------------------*/
  43. /* Private variables ---------------------------------------------------------*/
  44. vu16 ADC_RegularConvertedValueTab[32], ADC_InjectedConvertedValueTab[32];
  45. /* Private functions ---------------------------------------------------------*/

  46. void fmain(void)
  47. {
  48.   RCC_HSEConf(7);//56M

  49.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  50.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_LED |
  51.                          RCC_APB2Periph_ADC1  | RCC_APB2Periph_TIM1, ENABLE);
  52.   //复位ADC
  53.   RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1 , ENABLE);
  54.   RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1 , DISABLE);

  55.   
  56.   GPIO_InitTypeDef GPIO_InitStructure;
  57.   /* PA.01,02,03,04(ADC Channel11,2,3,4) as analog input ---------------------*/
  58.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
  59.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  60.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  61.   /* Configure TIM1_CH1 (PA8) as alternate function push-pull */
  62.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  63.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  64.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  65.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  66.   // LED
  67.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  68.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  69.   GPIO_Init(GPIO_LED, &GPIO_InitStructure);

  70.   
  71.   //NVIC for ADC2
  72.   NVIC_GroupSet(NVIC_PriorityGroup_0, ADC1_2_IRQn, 0);


  73.   /* DMA1 Channel1 Configuration ----------------------------------------------*/
  74.   DMA_InitTypeDef           DMA_InitStructure;
  75.   DMA_InitStructure.DMA_PeripheralBaseAddr = ((u32)0x4001244C);//ADC1_DR_Address;
  76.   DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_RegularConvertedValueTab;
  77.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  78.   DMA_InitStructure.DMA_BufferSize = 32;
  79.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  80.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  81.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  82.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  83.   DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  84.   DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  85.   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  86.   DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  87.   DMA_Cmd(DMA1_Channel1, ENABLE);

  88.   /* ADC1 configuration ------------------------------------------------------*/
  89.   ADC_InitTypeDef           ADC_InitStructure;
  90.   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  91.   ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  92.   ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  93.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;//本例重点
  94.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  95.   ADC_InitStructure.ADC_NbrOfChannel = 1;
  96.   ADC_Init(ADC1, &ADC_InitStructure);

  97.   ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_13Cycles5);
  98.   ADC_DMACmd(ADC1, ENABLE);
  99.   ADC_ExternalTrigConvCmd(ADC1, ENABLE);

  100.   ADC_InjectedSequencerLengthConfig(ADC1, 1);
  101.   ADC_InjectedChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_71Cycles5);
  102.   ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);
  103.   ADC_AutoInjectedConvCmd(ADC1, ENABLE);
  104.   ADC_ITConfig(ADC1, ADC_IT_JEOC, ENABLE);

  105.   // TIM1_channel1:PWM mode、 TIM输出比较极性低、0x7F
  106.   // F = TIMxCLK/(PSC+1)/(ARR+1)  (56/2*2)/4=14M *0x7F
  107.   TIM1->PSC = 3;
  108.   TIM1->ARR = 0xFF;
  109.   TIM1->CR1 = 0x0000;
  110.   TIM1->CCMR1 &= 0xFF00;
  111.   TIM1->CCMR1 |= 0x0060;
  112.   TIM1->CCER &= 0xFFF0;
  113.   TIM1->CCER |= 0x0003;
  114.   TIM1->CCR1 = 0x7F;

  115.   
  116.   ADC_Cmd(ADC1, ENABLE);
  117.   ADC_ResetCalibration(ADC1);
  118.   while(ADC_GetResetCalibrationStatus(ADC1));
  119.   ADC_StartCalibration(ADC1);
  120.   while(ADC_GetCalibrationStatus(ADC1));

  121.   TIM_Cmd(TIM1, ENABLE);
  122.   TIM_CtrlPWMOutputs(TIM1, ENABLE); //TIM1刹车和死区寄存器:主输出使能

  123.   while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));
  124.   DMA_ClearFlag(DMA1_FLAG_TC1);

  125.   TIM_Cmd(TIM1, DISABLE);
  126. }

  127. #endif
  128. /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
复制代码
Dylan疾风闪电 回答时间:2016-1-7 14:54:02
  1. /**
  2.   ******************************************************************************
  3.   * @file /BKP_Tamper.h
  4.   * @author    xd.wu
  5.   * @version   V1.0
  6.   * @date     2012-4-13
  7.   * @brief    BKP:保存VBAT掉电前的数据
  8.   当TAMPER引脚上的信号从’0’变成’1’或者从’1’变成’0’
  9.   (取决于备份控制寄存器BKP_CR的TPAL位),BKP_TamperPinLevelConfig(BKP_TamperPinLevel_Low);//设置侵入检测管脚的有效电平
  10.   会产生一个侵入检测事件。
  11.   侵入检测事件将所有数据备份寄存器内容清除。
  12.   在一个侵入事件被检测到并被清除后,侵入检测引脚TAMPER应该被禁止。
  13.   然后,在再次写入备份数据寄存器前重新用TPE位启动侵入检测功能。
  14.   这样,可以阻止软件在侵入检测引脚上仍然有侵入事件时对备份数据寄存器进行写操作。这相当于对侵入引脚TAMPER进行电平检测。
  15.   ******************************************************************************
  16.   *用途:“保密”,即一旦受到意外的侵入,STM32将毁灭数据。这是通过Tamper机制来实现的。
  17.   只要仍有VBAT,那么Tamper检测仍是有效的.
  18.   注意:这个引脚的上拉电阻必须接到VBAT而不是接到VDD。
  19.   否则,如果电源断开(VDD变低),也会引发一次Tamper事件,而这往往并不是设计都的本意。
  20.   */
  21.   /*实例应用步骤:
  22.   //1."main.cpp"调用fmain()
  23.   
  24.   //2."stm32f10x_it.cpp"拷贝
  25.   #define GPIO_LED          GPIOF
  26.   extern u32 IsBackupRegReset(void);
  27.   void TAMPER_IRQHandler(void)
  28.   {
  29.     if(BKP_GetITStatus() != RESET)
  30.     {
  31.       if(IsBackupRegReset() == 0)// Check if Backup registers are cleared
  32.       {
  33.         GPIO_WriteBit(GPIO_LED, GPIO_Pin_8, Bit_SET);
  34.       }
  35.       else
  36.       {
  37.         GPIO_WriteBit(GPIO_LED, GPIO_Pin_9, Bit_SET);
  38.       }
  39.       BKP_ClearITPendingBit();// Clear Tamper pin interrupt pending bit
  40.       BKP_ClearFlag();// Clear Tamper pin Event(TE) pending flag
  41.     }
  42.   }
  43.   
  44.   //3."stm32f10x_it.h"声明
  45.   void TAMPER_IRQHandler(void);
  46.   
  47.   //4.Watch中观察
  48.   LED
  49.   */

  50. #ifndef __BKP_TAMPER_H
  51. #define __BKP_TAMPER_H
  52. /* Includes ------------------------------------------------------------------*/
  53. #include "std32periph.h"

  54. /* Private typedef -----------------------------------------------------------*/
  55. /* Private define ------------------------------------------------------------*/
  56. #define GPIO_LED          GPIOF   
  57. #define RCC_LED           RCC_APB2Periph_GPIOF
  58. #define BKP_DR_NUMBER     42
  59. /* Private macro -------------------------------------------------------------*/
  60. /* Private variables ---------------------------------------------------------*/
  61. u16 BKPDataReg[BKP_DR_NUMBER] =
  62. {
  63.   BKP_DR1, BKP_DR2, BKP_DR3, BKP_DR4, BKP_DR5, BKP_DR6, BKP_DR7, BKP_DR8,
  64.   BKP_DR9, BKP_DR10, BKP_DR11, BKP_DR12, BKP_DR13, BKP_DR14, BKP_DR15, BKP_DR16,
  65.   BKP_DR17, BKP_DR18, BKP_DR19, BKP_DR20, BKP_DR21, BKP_DR22, BKP_DR23, BKP_DR24,
  66.   BKP_DR25, BKP_DR26, BKP_DR27, BKP_DR28, BKP_DR29, BKP_DR30, BKP_DR31, BKP_DR32,
  67.   BKP_DR33, BKP_DR34, BKP_DR35, BKP_DR36, BKP_DR37, BKP_DR38, BKP_DR39, BKP_DR40,
  68.   BKP_DR41, BKP_DR42
  69. };
  70. /* Private functions ---------------------------------------------------------*/

  71. u32 IsBackupRegReset(void)
  72. {
  73.   for (u8 index = 0; index < BKP_DR_NUMBER; index++)
  74.   {
  75.     if (BKP_ReadBackupRegister(BKPDataReg[index]) != 0x0000)
  76.       return (index + 1);
  77.   }
  78.   return 0;  
  79. }

  80. u32 CheckBackupReg(u16 FirstBackupData)
  81. {
  82.   for (u8 index = 0; index < BKP_DR_NUMBER; index++)
  83.   {
  84.     if (BKP_ReadBackupRegister(BKPDataReg[index]) != (FirstBackupData + (index * 0x5A)))
  85.       return (index + 1);
  86.   }
  87.   return 0;  
  88. }

  89. void fmain(void)
  90. {
  91.   RCC_HSEConf(9);//72M

  92.   RCC_APB2PeriphClockCmd(RCC_LED, ENABLE);

  93.   /* Configure GPIO_LED Pin 6, Pin 7, Pin 8 and Pin 9 as Output push-pull ----*/
  94.   GPIO_InitTypeDef GPIO_InitStructure;
  95.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
  96.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  97.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  98.   GPIO_Init(GPIO_LED, &GPIO_InitStructure);
  99.   
  100.   
  101.   //NVIC for ADC2
  102.   NVIC_GroupSet(NVIC_PriorityGroup_0, TAMPER_IRQn, 0);

  103.   
  104.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
  105.   PWR_BackupAccessCmd(ENABLE);//使能RTC和后备寄存器访问
  106.   BKP_ClearFlag();
  107.   BKP_TamperPinLevelConfig(BKP_TamperPinLevel_Low);//设置侵入检测管脚的有效电平
  108.   BKP_ITConfig(ENABLE);
  109.   BKP_TamperPinCmd(ENABLE);
  110.    
  111.   u16 FirstBackupData = 0xA53C;
  112.   for (u8 index = 0; index < BKP_DR_NUMBER; index++)
  113.   {
  114.     BKP_WriteBackupRegister(BKPDataReg[index], FirstBackupData + (index * 0x5A));
  115.   }  

  116.   if(CheckBackupReg(0xA53C) == 0x00)
  117.   {
  118.     GPIO_Write(GPIO_LED, GPIO_Pin_6);
  119.   }
  120.   else
  121.   {
  122.     GPIO_Write(GPIO_LED, GPIO_Pin_7);
  123.   }
  124. }

  125. #endif
  126. /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
复制代码
Dylan疾风闪电 回答时间:2016-1-7 14:55:06
本帖最后由 Dylan疾风闪电 于 2016-1-7 15:02 编辑
  1. /**
  2.   ******************************************************************************
  3.   * @file /CAN_Example.h
  4.   * @author    xd.wu
  5.   * @version   V1.0
  6.   * @date     2012-4-13
  7.   * @brief    CAN:
  8.   收发寄存器 RDLR,RDHR,TDLR,TDHR
  9.   例如 CANx->sFIFOMailBox[FIFONumber].RDLR;
  10.   ******************************************************************************
  11.   *
  12.   */
  13.   /*实例应用步骤:
  14.   //1."main.cpp"调用fmain()
  15.   
  16.   //2."stm32f10x_it.cpp"拷贝
  17.   extern vu32 ret;
  18.   void USB_LP_CAN1_RX0_IRQHandler(void)
  19.   {
  20.     CanRxMsg RxMessage;
  21.     RxMessage.StdId=0x00;
  22.     RxMessage.ExtId=0x00;
  23.     RxMessage.IDE=0;
  24.     RxMessage.DLC=0;
  25.     RxMessage.FMI=0;
  26.     RxMessage.Data[0]=0x00;
  27.     RxMessage.Data[1]=0x00;
  28.     CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
  29.     if((RxMessage.ExtId==0x1234) && (RxMessage.IDE==CAN_ID_EXT)
  30.        && (RxMessage.DLC==2) && ((RxMessage.Data[1]|RxMessage.Data[0]<<8)==0xDECA))
  31.       ret = 1;
  32.     else
  33.       ret = 0;
  34.   }
  35.   
  36.   //3."stm32f10x_it.h"声明
  37.   void USB_LP_CAN1_RX0_IRQHandler(void);
  38.   
  39.   //4.Watch中观察
  40.   LED
  41.   */

  42. #ifndef __CAN_EXAMPLE_H
  43. #define __CAN_EXAMPLE_H
  44. /* Includes ------------------------------------------------------------------*/
  45. #include "std32periph.h"

  46. /* Private typedef -----------------------------------------------------------*/
  47. typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;
  48. /* Private define ------------------------------------------------------------*/
  49. #define GPIO_LED          GPIOF   
  50. #define RCC_LED           RCC_APB2Periph_GPIOF
  51. /* Private macro -------------------------------------------------------------*/
  52. /* Private variables ---------------------------------------------------------*/
  53. vu32 ret = 0; /* for return of the interrupt handling */
  54. volatile TestStatus TestRx;
  55. /* Private functions ---------------------------------------------------------*/

  56. TestStatus CAN_Polling(void)
  57. {
  58.   CAN_InitTypeDef        CAN_InitStructure;
  59.   CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  60.   CanTxMsg TxMessage;
  61.   CanRxMsg RxMessage;
  62.   u32 i = 0;
  63.   u8 TransmitMailbox = 0;

  64.   /* CAN register init */
  65.   CAN_DeInit(CAN1);
  66.   CAN_StructInit(&CAN_InitStructure);

  67.   /* CAN cell init */
  68.   CAN_InitStructure.CAN_TTCM=DISABLE;
  69.   CAN_InitStructure.CAN_ABOM=DISABLE;
  70.   CAN_InitStructure.CAN_AWUM=DISABLE;
  71.   CAN_InitStructure.CAN_NART=DISABLE;
  72.   CAN_InitStructure.CAN_RFLM=DISABLE;
  73.   CAN_InitStructure.CAN_TXFP=DISABLE;
  74.   CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;
  75.   CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  76.   CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
  77.   CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
  78.   CAN_InitStructure.CAN_Prescaler=5;
  79.   CAN_Init(CAN1, &CAN_InitStructure);

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

  91.   /* transmit */
  92.   TxMessage.StdId=0x11;
  93.   TxMessage.RTR=CAN_RTR_DATA;
  94.   TxMessage.IDE=CAN_ID_STD;
  95.   TxMessage.DLC=2;
  96.   TxMessage.Data[0]=0xCA;
  97.   TxMessage.Data[1]=0xFE;

  98.   TransmitMailbox=CAN_Transmit(CAN1, &TxMessage);
  99.   i = 0;
  100.   while((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK) && (i != 0xFF))
  101.   {
  102.     i++;
  103.   }

  104.   i = 0;
  105.   while((CAN_MessagePending(CAN1, CAN_FIFO0) < 1) && (i != 0xFF))
  106.   {
  107.     i++;
  108.   }

  109.   /* receive */
  110.   RxMessage.StdId=0x00;
  111.   RxMessage.IDE=CAN_ID_STD;
  112.   RxMessage.DLC=0;
  113.   RxMessage.Data[0]=0x00;
  114.   RxMessage.Data[1]=0x00;
  115.   CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);

  116.   if (RxMessage.StdId!=0x11)
  117.   {
  118.     return FAILED;  
  119.   }

  120.   if (RxMessage.IDE!=CAN_ID_STD)
  121.   {
  122.     return FAILED;
  123.   }

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

  128.   if ((RxMessage.Data[0]<<8|RxMessage.Data[1])!=0xCAFE)
  129.   {
  130.     return FAILED;
  131.   }
  132.   
  133.   return PASSED; /* Test Passed */
  134. }

  135. TestStatus CAN_Interrupt(void)
  136. {
  137.   CAN_InitTypeDef        CAN_InitStructure;
  138.   CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  139.   CanTxMsg TxMessage;
  140.   u32 i = 0;

  141.   /* CAN register init */
  142.   CAN_DeInit(CAN1);
  143.   CAN_StructInit(&CAN_InitStructure);

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

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

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

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

  179.   /* initialize the value that will be returned */
  180.   ret = 0xFF;
  181.       
  182.   /* receive message with interrupt handling */
  183.   i=0;
  184.   while((ret == 0xFF) && (i < 0xFFF))
  185.   {
  186.     i++;
  187.   }
  188.   
  189.   if (i == 0xFFF)
  190.   {
  191.     ret=0;  
  192.   }

  193.   /* disable interrupt handling */
  194.   CAN_ITConfig(CAN1, CAN_IT_FMP0, DISABLE);

  195.   return (TestStatus)ret;
  196. }

  197. void fmain(void)
  198. {
  199.   RCC_HSEConf(9);//72M

  200.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_LED, ENABLE);
  201.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
  202.   //复位CAN
  203.   RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1 , ENABLE);
  204.   RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1 , DISABLE);

  205.   GPIO_InitTypeDef GPIO_InitStructure;
  206.   /* Configure GPIO_LED pin6, pin7, pin8 and pin9 as Output push-pull */
  207.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
  208.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  209.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  210.   GPIO_Init(GPIO_LED, &GPIO_InitStructure);
  211.   /* Configure CAN pin: RX */
  212.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  213.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  214.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  215.   /* Configure CAN pin: TX */
  216.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  217.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  218.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  219.   
  220.   
  221.   //NVIC for ADC2
  222.   NVIC_GroupSet(NVIC_PriorityGroup_0, USB_LP_CAN1_RX0_IRQn, 0);

  223.   
  224.   TestRx = CAN_Polling();/* CAN transmit at 100Kb/s and receive by polling in loopback mode */
  225.   if (TestRx == FAILED)
  226.   {
  227.     GPIO_SetBits(GPIO_LED, GPIO_Pin_8);
  228.   }
  229.   else
  230.   {
  231.     GPIO_SetBits(GPIO_LED, GPIO_Pin_6);
  232.   }

  233.   TestRx = CAN_Interrupt();/* CAN transmit at 500Kb/s and receive by interrupt in loopback mode */
  234.   if (TestRx == FAILED)
  235.   {
  236.     GPIO_SetBits(GPIO_LED, GPIO_Pin_9);
  237.   }
  238.   else
  239.   {
  240.     GPIO_SetBits(GPIO_LED, GPIO_Pin_7);
  241.   }
  242. }

  243. #endif
  244. /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
复制代码

zhangdaijin 回答时间:2016-1-7 14:59:19
这个牛!!!
Dylan疾风闪电 回答时间:2016-1-7 15:03:34
  1. /**
  2.   ******************************************************************************
  3.   * @file /CM3_BitBand.h
  4.   * @author    xd.wu
  5.   * @version   V1.0
  6.   * @date     2012-4-13
  7.   * @brief    CM3:BitBand(别名区域)
  8.   use CortexM3 Bit-Band access to perform atomic read-modify-write and read operations on a varaible in SRAM.
  9.   对Bit-band区域某个字节的写操作,Cortex-M3都将自动转换成对相对应比特位的读-修改-写操作。
  10.   对Bit-band区域某个字节的读操作则将转换成相对应比特位的读操作。
  11.   公式:Bit-Band地址= Bit-Band域首地址 + (操作字节的偏移量× 32) + (操作位的偏移量× 4)
  12.                     = Bit-Band域首地址 | (操作字节的偏移量<<5) | (操作位的偏移量<<2)
  13.   内置SRAM区的Bit-Band域首地址为0x22000000
  14.   外设寄存器区的Bit-Band域首地址为0x42000000
  15.   ******************************************************************************
  16.   *用途:通过宏BitBand_GetAddr()计算得到别名区域的地址,从而简化位操作
  17.   由"stm32f10x_flash.icf"文件可知,实际可用的Flash空间不是无限的
  18.   ROM = 0x08000000 ~ 0x080FFFFF;
  19.   RAM = 0x20000000 ~ 0x2000FFFF;//64KB
  20.   cstack = 0x800;
  21.   heap = 0x200;
  22.   place in ROM_region   { readonly };//1024KB = u16(2Byte)*512*1024
  23.   place in RAM_region   { readwrite,//61.5KB = u16*123*256=u16*31488
  24.                         block CSTACK,//2KB = u16*1024
  25.                         block HEAP };//512Byte = u16*256
  26.   */
  27.   /*实例应用步骤:
  28.   //1."main.cpp"调用fmain()

  29.   //2.Watch中观察
  30.   LED
  31.   */

  32. #ifndef __CM3_BITBAND_H
  33. #define __CM3_BITBAND_H
  34. /* Includes ------------------------------------------------------------------*/
  35. #include "std32periph.h"

  36. /* Private typedef -----------------------------------------------------------*/
  37. /* Private define ------------------------------------------------------------*/
  38. #define RAM_BASE       0x20000000
  39. #define RAM_BB_BASE    0x22000000
  40. /* Private macro -------------------------------------------------------------*/
  41. #define  Var_ResetBit_BB(VarAddr, BitNumber)    \
  42.           (*(vu32 *) (RAM_BB_BASE | ((VarAddr - RAM_BASE) << 5) | ((BitNumber) << 2)) = 0)
  43.    
  44. #define Var_SetBit_BB(VarAddr, BitNumber)       \
  45.           (*(vu32 *) (RAM_BB_BASE | ((VarAddr - RAM_BASE) << 5) | ((BitNumber) << 2)) = 1)

  46. #define Var_GetBit_BB(VarAddr, BitNumber)       \
  47.           (*(vu32 *) (RAM_BB_BASE | ((VarAddr - RAM_BASE) << 5) | ((BitNumber) << 2)))

  48. //自添加BitBand原始公式
  49. #define BitBand_SetVal(PPP, Offset, BitNo, Val)\
  50.           (*(vu32*) (0x42000000 | ((PPP & 0x0FFFFFFF)<<5) | (Offset<<5) | (BitNo<<2)) = (Val))
  51. #define BitBand_GetAddr(PPP, Offset, BitNo)\
  52.           (0x42000000 | ((PPP & 0x0FFFFFFF)<<5) | (Offset<<5) | (BitNo<<2))
  53. /* Private variables ---------------------------------------------------------*/
  54. vu32 Var, VarAddr = 0, VarBitValue = 0;
  55. /* Private functions ---------------------------------------------------------*/

  56. void fmain(void)
  57. {
  58.   Var = 0x00005AA5;

  59.   RCC_HSEConf(9);//72M

  60. /* A mapping formula shows how to reference each word in the alias region to a corresponding
  61. bit in the bit-band region. The mapping formula is:
  62.   bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number ?4)

  63. where:
  64.    - bit_word_addr: is the address of the word in the alias memory region that maps to the
  65.                     targeted bit.
  66.    - bit_band_base is the starting address of the alias region
  67.    - byte_offset is the number of the byte in the bit-band region that contains the targeted bit
  68.    - bit_number is the bit position (0-7) of the targeted bit */

  69. /* Get the variable address --------------------------------------------------*/
  70.   VarAddr = (u32)&Var;

  71. /* Modify variable bit using bit-band access ---------------------------------*/
  72.   /* Modify Var variable bit 0 -----------------------------------------------*/
  73.   Var_ResetBit_BB(VarAddr, 0);  /* Var = 0x00005AA4 */
  74.   Var_SetBit_BB(VarAddr, 0);    /* Var = 0x00005AA5 */
  75.   
  76.   /* Modify Var variable bit 11 -----------------------------------------------*/
  77.   Var_ResetBit_BB(VarAddr, 11);             /* Var = 0x000052A5 */
  78.   /* Get Var variable bit 11 value */
  79.   VarBitValue = Var_GetBit_BB(VarAddr, 11); /* VarBitValue = 0x00000000 */
  80.   
  81.   Var_SetBit_BB(VarAddr, 11);               /* Var = 0x00005AA5 */
  82.   /* Get Var variable bit 11 value */
  83.   VarBitValue = Var_GetBit_BB(VarAddr, 11);    /* VarBitValue = 0x00000001 */
  84.   
  85.   /* Modify Var variable bit 31 -----------------------------------------------*/
  86.   Var_SetBit_BB(VarAddr, 31);               /* Var = 0x80005AA5 */
  87.   /* Get Var variable bit 31 value */
  88.   VarBitValue = Var_GetBit_BB(VarAddr, 31); /* VarBitValue = 0x00000001 */
  89.    
  90.   Var_ResetBit_BB(VarAddr, 31);             /* Var = 0x00005AA5 */
  91.   /* Get Var variable bit 31 value */
  92.   VarBitValue = Var_GetBit_BB(VarAddr, 31); /* VarBitValue = 0x00000000 */
  93.   
  94.   //自己添加的程序:点亮LED(PF.06)
  95.   (*(vu32*)0x4242031C) = 1;//RCC_APB2...IOFEN
  96.   
  97.   (*(vu32*)0x42238060) = 1;//GPIOF_CRL...MODE6_0(0x4223806?)
  98.   (*(vu32*)0x42238064) = 1;//GPIOF_CRL...MODE6_1
  99.   (*(vu32*)0x42238068) = 0;//GPIOF_CRL...CNF6_0
  100.   (*(vu32*)0x4223806C) = 0;//GPIOF_CRL...CNF6_1
  101.   
  102.   (*(vu32*)0x42238070) = 1;//GPIOF_CRL...MODE7_0(0x4223807?)
  103.   (*(vu32*)0x42238074) = 1;//GPIOF_CRL...MODE7_1
  104.   (*(vu32*)0x42238078) = 0;//GPIOF_CRL...CNF7_0
  105.   (*(vu32*)0x4223807C) = 0;//GPIOF_CRL...CNF7_1
  106.   
  107.   (*(vu32*)0x42238080) = 1;//GPIOF_CRH...MODE8_0(0x4223808?)
  108.   (*(vu32*)0x42238084) = 1;//GPIOF_CRH...MODE8_1
  109.   (*(vu32*)0x42238088) = 0;//GPIOF_CRH...CNF8_0
  110.   (*(vu32*)0x4223808C) = 0;//GPIOF_CRH...CNF8_1
  111.   
  112.   (*(vu32*)0x42238090) = 1;//GPIOF_CRH...MODE9_0(0x4223809?)
  113.   (*(vu32*)0x42238094) = 1;//GPIOF_CRH...MODE9_1
  114.   (*(vu32*)0x42238098) = 0;//GPIOF_CRH...CNF9_0
  115.   (*(vu32*)0x4223809C) = 0;//GPIOF_CRH...CNF9_1

  116.   u8 ms_1 = 10, ms = 100;
  117.   u32 base = 1500;//100~1000
  118.   s8  is = 1;
  119.   while(1)
  120.   {
  121.     (*(vu32*)0x42238198) = 1;//GPIOF_ODR...Pin6
  122.     (*(vu32*)0x4223819C) = 0;//GPIOF_ODR...Pin7
  123.     (*(vu32*)0x422381A0) = 1;//GPIOF_ODR...Pin8
  124.     (*(vu32*)0x422381A4) = 0;//GPIOF_ODR...Pin9
  125.    
  126.     Delay_us(ms_1*base,72);
  127.    
  128.     (*(vu32*)0x42238198) = 0;//GPIOF_ODR...Pin6
  129.     (*(vu32*)0x4223819C) = 1;//GPIOF_ODR...Pin7
  130.     (*(vu32*)0x422381A0) = 0;//GPIOF_ODR...Pin8
  131.     (*(vu32*)0x422381A4) = 1;//GPIOF_ODR...Pin9
  132.    
  133.     Delay_us((ms-ms_1)*base,72);
  134.    
  135.     ms_1 += 10*is;
  136.     if(ms_1 <= 10)
  137.       is = 1;
  138.     else if(ms_1 >= 90)
  139.       is = -1;
  140.   }
  141.   /*同上:区别是,上面直接用已知的地址 操作位,下面宏计算地址 并操作位
  142.   BitBand_SetVal(RCC_BASE, 0x18, 7, 1); //RCC_APB2ENR_IOPFEN
  143.   BitBand_SetVal(GPIOF_BASE, 0, 27, 0);//GPIOF_CRL
  144.   BitBand_SetVal(GPIOF_BASE, 0, 26, 0);
  145.   BitBand_SetVal(GPIOF_BASE, 0, 25, 1);
  146.   BitBand_SetVal(GPIOF_BASE, 0, 24, 1);
  147.   
  148.   BitBand_SetVal(GPIOF_BASE, 0, 31, 0);//GPIOF_CRL
  149.   BitBand_SetVal(GPIOF_BASE, 0, 30, 0);
  150.   BitBand_SetVal(GPIOF_BASE, 0, 29, 1);
  151.   BitBand_SetVal(GPIOF_BASE, 0, 28, 1);
  152.   
  153.   BitBand_SetVal(GPIOF_BASE, 4, 3, 0);//GPIOF_CRH
  154.   BitBand_SetVal(GPIOF_BASE, 4, 2, 0);
  155.   BitBand_SetVal(GPIOF_BASE, 4, 1, 1);
  156.   BitBand_SetVal(GPIOF_BASE, 4, 0, 1);
  157.   
  158.   BitBand_SetVal(GPIOF_BASE, 4, 7, 0);//GPIOF_CRH
  159.   BitBand_SetVal(GPIOF_BASE, 4, 6, 0);
  160.   BitBand_SetVal(GPIOF_BASE, 4, 5, 1);
  161.   BitBand_SetVal(GPIOF_BASE, 4, 4, 1);

  162.   while(1)
  163.   {
  164.     BitBand_SetVal(GPIOF_BASE, 0xC, 6, 1);//GPIOF_ODR
  165.     BitBand_SetVal(GPIOF_BASE, 0xC, 7, 0);//GPIOF_ODR
  166.     BitBand_SetVal(GPIOF_BASE, 0xC, 8, 1);//GPIOF_ODR
  167.     BitBand_SetVal(GPIOF_BASE, 0xC, 9, 0);//GPIOF_ODR
  168.    
  169.     Delay_us(2e5,72);
  170.    
  171.     BitBand_SetVal(GPIOF_BASE, 0xC, 6, 0);//GPIOF_ODR
  172.     BitBand_SetVal(GPIOF_BASE, 0xC, 7, 1);//GPIOF_ODR
  173.     BitBand_SetVal(GPIOF_BASE, 0xC, 8, 0);//GPIOF_ODR
  174.     BitBand_SetVal(GPIOF_BASE, 0xC, 9, 1);//GPIOF_ODR
  175.    
  176.     Delay_us(2e5,72);
  177.   }*/
  178. }

  179. #endif
  180. /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
复制代码
Dylan疾风闪电 回答时间:2016-1-7 15:04:51
  1. /**
  2.   ******************************************************************************
  3.   * @file /CM3_ModePrivilege.h
  4.   * @author    xd.wu
  5.   * @version   V1.0
  6.   * @date     2012-4-14
  7.   * @brief    CM3:特殊模式 (此例未验证成功:__set_PSP()等宏未定义)
  8.   ******************************************************************************
  9.   *用途:
  10.   */
  11.   /*实例应用步骤:
  12.   //1."main.cpp"调用fmain()

  13.   //2."stm32f10x_it.cpp"修改系统中断
  14.   void SVCHandler(void)
  15.   {
  16.     __set_CONTROL(2);// Switch back Thread mode to privileged
  17.   }

  18.   //3.Watch中观察
  19.   */

  20. #ifndef __CM3_MODEPRIVILEGE_H
  21. #define __CM3_MODEPRIVILEGE_H
  22. /* Includes ------------------------------------------------------------------*/
  23. #include "std32periph.h"
  24. #include "core_cm3.h"//宏__...

  25. /* Private typedef -----------------------------------------------------------*/
  26. /* Private define ------------------------------------------------------------*/
  27. #define SP_PROCESS_SIZE             0x200  /* Process stack size */
  28. #define SP_PROCESS                  0x02   /* Process stack */
  29. #define SP_MAIN                     0x00   /* Main stack */
  30. #define THREAD_MODE_PRIVILEGED      0x00   /* Thread mode has privileged access */
  31. #define THREAD_MODE_UNPRIVILEGED    0x01   /* Thread mode has unprivileged access */
  32. /* Private macro -------------------------------------------------------------*/
  33. /* Private variables ---------------------------------------------------------*/
  34. vu8 PSPMemAlloc[SP_PROCESS_SIZE];
  35. vu32 Index = 0, PSPValue = 0, CurrentStack = 0, ThreadMode = 0;
  36. /* Private functions ---------------------------------------------------------*/

  37. void fmain(void)
  38. {
  39.   RCC_HSEConf(9);//72M

  40. /* Switch Thread mode Stack from Main to Process -----------------------------*/
  41.   /* Initialize memory reserved for Process Stack */
  42.   for(Index = 0; Index < SP_PROCESS_SIZE; Index++)
  43.   {
  44.     PSPMemAlloc[Index] = 0x00;
  45.   }

  46.   /* Set Process stack value */
  47.   __set_PSP((u32)PSPMemAlloc + SP_PROCESS_SIZE);
  48.   
  49.   /* Select Process Stack as Thread mode Stack */
  50.   __set_CONTROL(SP_PROCESS);

  51.   /* Get the Thread mode stack used */
  52.   if((__get_CONTROL() & 0x02) == SP_MAIN)
  53.   {
  54.     /* Main stack is used as the current stack */
  55.         CurrentStack = SP_MAIN;
  56.   }
  57.   else
  58.   {
  59.     /* Process stack is used as the current stack */
  60.         CurrentStack = SP_PROCESS;
  61.        
  62.         /* Get process stack pointer value */
  63.         PSPValue = __get_PSP();       
  64.   }
  65.   
  66. /* Switch Thread mode from privileged to unprivileged ------------------------*/
  67.   /* Thread mode has unprivileged access */
  68.   __set_CONTROL(THREAD_MODE_UNPRIVILEGED | SP_PROCESS);
  69.   /* Unprivileged access mainly affect ability to:
  70.       - Use or not use certain instructions such as MSR fields
  71.           - Access System Control Space (SCS) registers such as NVIC and SysTick */

  72.   /* Check Thread mode privilege status */
  73.   if((__get_CONTROL() & 0x01) == THREAD_MODE_PRIVILEGED)
  74.   {
  75.     /* Thread mode has privileged access  */
  76.         ThreadMode = THREAD_MODE_PRIVILEGED;
  77.   }
  78.   else
  79.   {
  80.     /* Thread mode has unprivileged access*/
  81.         ThreadMode = THREAD_MODE_UNPRIVILEGED;
  82.   }

  83. /* Switch back Thread mode from unprivileged to privileged -------------------*/  
  84.   /* Try to switch back Thread mode to privileged (Not possible, this can be
  85.      done only in Handler mode) */
  86.   __set_CONTROL(THREAD_MODE_PRIVILEGED | SP_PROCESS);

  87.   /* Generate a system call exception, and in the ISR switch back Thread mode
  88.     to privileged */
  89.   //__SVC();

  90.   /* Check Thread mode privilege status */
  91.   if((__get_CONTROL() & 0x01) == THREAD_MODE_PRIVILEGED)
  92.   {
  93.     /* Thread mode has privileged access  */
  94.         ThreadMode = THREAD_MODE_PRIVILEGED;
  95.   }
  96.   else
  97.   {
  98.     /* Thread mode has unprivileged access*/
  99.         ThreadMode = THREAD_MODE_UNPRIVILEGED;
  100.   }
  101. }

  102. #endif
  103. /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
复制代码

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版