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

STM32库开发实战指南F103读后感和学习笔记

[复制链接]
Bowen 发布时间:2018-12-12 15:38
本帖最后由 strang 于 2018-12-12 16:08 编辑

编辑原因:上传代码不全,补齐代码。

在“野火助力,书香醉人—第四轮书籍申请 ”活动中申请到了《STM32库开发实战指南---基于STM32F103》 一书,此书共分基础篇和提高篇,46章,693页,内容非常丰富,全面讲解了各个外设和代码分析,火哥的例程写的很详细,移植起来非常方便,而且例程也很接近项目实际应用,在此感谢意法半导体STM32/STM8技术社区,感谢野火提供的书籍,感谢工作人员!
一、NVIC中断优先级
NVIC优先级分5组,主优先级数字越小优先级越高,子优先级在主优先级同等下,数字越小优先级越高。用到哪个中断,就用对应的中断源和使能中断。
NVIC.jpg
下面是使能串口1的中断,同时设置抢占优先级为1,响应优先级为2的初始化方法:
  1. static void NVIC_Configuration(void)
  2. {
  3.   NVIC_InitTypeDef NVIC_InitStructure;
  4.   /* 嵌套向量中断控制器组选择 */
  5.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  6.   /* 配置USART为中断源 */
  7.   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQ;
  8.   /* 抢断优先级*/
  9.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  10.   /* 子优先级 */
  11.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  12.   /* 使能中断 */
  13.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  14.   /* 初始化配置NVIC */
  15.   NVIC_Init(&NVIC_InitStructure);
  16. }
复制代码
二、DMA---直接存储器访问

DAMDAM1DMA2两个控制器,DMA17个通道,DMA25个通道。
DMA.jpg
DMA传输数据的方向有3个,外设到存储器,存储器到外设和存储器到存储器。
1. 串口DMA配置:(从存储器到外设)
  1. void USARTx_DMA_Config(void)
  2. {
  3.         DMA_InitTypeDef DMA_InitStructure;
  4.         // 开启DMA时钟
  5.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  6.         // 设置DMA源地址:串口数据寄存器地址*/
  7.     DMA_InitStructure.DMA_PeripheralBaseAddr = USART_DR_ADDRESS;
  8.         // 内存地址(要传输的变量的指针)
  9.         DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;
  10.         // 方向:从内存到外设        
  11.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  12.         // 传输大小        
  13.         DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;
  14.         // 外设地址不增            
  15.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  16.         // 内存地址自增
  17.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  18.         // 外设数据单位        
  19.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  20.         // 内存数据单位
  21.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         
  22.         // DMA模式,一次或者循环模式
  23.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
  24.         //DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;        
  25.         // 优先级:中        
  26.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
  27.         // 禁止内存到内存的传输
  28.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  29.         // 配置DMA通道                  
  30.         DMA_Init(USART_TX_DMA_CHANNEL, &DMA_InitStructure);               
  31.         // 使能DMA
  32.         DMA_Cmd (USART_TX_DMA_CHANNEL,ENABLE);
  33. }
复制代码
2. 配置ADC1的工作模式为DMA模式(从外设到存储器)4路ADC
  1. u16 AD_Value[N][M]; //用来存放ADC转换结果,也是DMA的目标地址
  2. u16 After_filter[M]; //用来存放平均值之后的结果

  3. //使能ADC1和DMA1的时钟,初始化PC1-PC3端口
  4. static void ADC1_GPIO_Config(void)
  5. {
  6.         GPIO_InitTypeDef GPIO_InitStructure;
  7.         
  8.         /* Enable DMA clock */
  9.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  10.         
  11.         /* Enable ADC1 and GPIOC clock */
  12.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
  13.         
  14.         //PC 作为模拟通道输入引脚                        
  15.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;               
  17.         GPIO_Init(GPIOC, &GPIO_InitStructure);        
  18. }

  19. //配置ADC1的工作模式为DMA模式
  20. static void ADC1_Mode_Config(void)
  21. {
  22.         DMA_InitTypeDef DMA_InitStructure;
  23.         ADC_InitTypeDef ADC_InitStructure;
  24.         
  25.         /* DMA channel1 configuration */
  26.         DMA_DeInit(DMA1_Channel1);
  27.         DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;

  28.         //内存地址  
  29.   DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&AD_Value[0][0];
  30.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  31.         DMA_InitStructure.DMA_BufferSize =M*N;
  32.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  33.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  34.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  35.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  36.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  37.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  38.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  39.         DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  40.         
  41.         /* Enable DMA channel1 */
  42.         DMA_Cmd(DMA1_Channel1, ENABLE);
  43.         
  44.         /* ADC1 configuration */        
  45.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  46.         ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  47.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  48.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  49.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  50.         ADC_InitStructure.ADC_NbrOfChannel = M;
  51.         ADC_Init(ADC1, &ADC_InitStructure);
  52.         
  53.         /*配置ADC时钟,为PCLK2的8分频,即9Hz*/
  54.         RCC_ADCCLKConfig(RCC_PCLK2_Div8);
  55.         /*配置ADC1的通道11为55.        5个采样周期,序列为1 */
  56.         ///ADC_SampleTime_239Cycles5     ADC_SampleTime_55Cycles5
  57.         ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5);
  58.         ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_239Cycles5);
  59.         ADC_RegularChannelConfig(ADC1, ADC_Channel_12 ,3, ADC_SampleTime_239Cycles5);  
  60.         ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 4, ADC_SampleTime_239Cycles5);
  61.         
  62.         /* Enable ADC1 DMA */
  63.         ADC_DMACmd(ADC1, ENABLE);
  64.         
  65.         /* Enable ADC1 */
  66.         ADC_Cmd(ADC1, ENABLE);
  67.         
  68.         /*复位校准寄存器 */   
  69.         ADC_ResetCalibration(ADC1);
  70.         /*等待校准寄存器复位完成*/
  71.         while(ADC_GetResetCalibrationStatus(ADC1));
  72.         
  73.         /* ADC校准 */
  74.         ADC_StartCalibration(ADC1);
  75.         /* 等待校准完成*/
  76.         while(ADC_GetCalibrationStatus(ADC1));
  77.         
  78.         /* 软件触发ADC转换 */
  79.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  80. }
  81. /* ADC1初始化*/
  82. void ADC1_Init(void)
  83. {
  84.         ADC1_GPIO_Config();
  85.         ADC1_Mode_Config();
  86. }
复制代码
  1. /*ADC滤波*/
  2. u16 MultiDMAGetAdcTest(u8 ch)
  3. {
  4. u8 i;
  5. u32 AdcMax,AdcMin,AdcSum,AdcResult,Adc_temp;
  6. volatile u32 ADC_Data;

  7. ADC_Data=0;

  8. AdcMax=0;
  9. AdcMin=~0;
  10. AdcSum = 0;
  11. Adc_temp = 0;

  12. for(i=0;i<34;i++)
  13. {
  14. Adc_temp =AD_Value[i][ch];
  15. if(Adc_temp>AdcMax)
  16. {
  17. AdcMax=Adc_temp;
  18. }
  19. if(Adc_temp<AdcMin)
  20. {
  21. AdcMin=Adc_temp;
  22. }
  23. AdcSum+=Adc_temp;
  24. }
  25. AdcResult=(AdcSum-AdcMax-AdcMin)>>5;
  26. After_filter[ch]=(u16)AdcResult;
  27. return(After_filter[ch]);
  28. }
  29. /*获取ADC1通道0的值*/
  30. uint16_t AD_Leach(void)
  31. {
  32. uint16_t adcx1;
  33. adcx1=MultiDMAGetAdcTest(ADC_Channel_0);
  34. return(adcx1);
  35. }
  36. /*获取ADC1通道1的值*/
  37. uint16_t AD_Leach_1(void)
  38. {
  39. uint16_t adcx2;
  40. adcx2=MultiDMAGetAdcTest(ADC_Channel_1);
  41. return(adcx2);
  42. }
  43. /*获取ADC1通道2的值*/
  44. uint16_t AD_Leach_2(void)
  45. {
  46. uint16_t adcx3;
  47. adcx3=MultiDMAGetAdcTest(ADC_Channel_2);
  48. return(adcx3);
  49. }
  50. /*获取ADC1通道3的值*/
  51. uint16_t AD_Leach_3(void)
  52. {
  53. uint16_t adcx4;
  54. adcx4=MultiDMAGetAdcTest(ADC_Channel_3);
  55. return(adcx4);
  56. }
复制代码


目前就学习到这里,后续再写!



收藏 评论3 发布时间:2018-12-12 15:38

举报

3个回答
dianlu89 回答时间:2018-12-12 16:37:21
加油,一起学习
qingfeinglingsa 回答时间:2018-12-12 17:12:34
最近才开始学习
sincomaster 回答时间:2018-12-12 23:54:32
哎,这差距,我才刚点亮一个LED灯

所属标签

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