打印
[STM32F0]

请教一个代码问题。多谢了

[复制链接]
2110|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我用工具生成了这么一段代码:
void MX_ADC1_Init(void)
{

  ADC_ChannelConfTypeDef sConfig;

    /**Common config
    */
  hadc1.Instance = ADC1;
  hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 16;
  HAL_ADC_Init(&hadc1);

其中init的定义是
typedef struct
{
  ADC_TypeDef                   *Instance;              /*!< Register base address */

  ADC_InitTypeDef               Init;                   /*!< ADC required parameters */

  __IO uint32_t                 NbrOfConversionRank ;   /*!< ADC conversion rank counter */

  DMA_HandleTypeDef             *DMA_Handle;            /*!< Pointer DMA Handler */

  HAL_LockTypeDef               Lock;                   /*!< ADC locking object */

  __IO HAL_ADC_StateTypeDef     State;                  /*!< ADC communication state */

  __IO uint32_t                 ErrorCode;              /*!< ADC Error code */
}ADC_HandleTypeDef;

而ADC_InitTypeDef的定义是
typedef struct
{
  uint32_t DataAlign;
uint32_t ScanConvMode;
等等}ADC_InitTypeDef

我想问的是,这个init的那些东西都指代了什么啊?比如DataAlign,为什么代表寄存器上的align位呢?在头文件里也没找到啊
沙发
xueyechongzi|  楼主 | 2015-5-29 11:13 | 只看该作者
或者说,这段程序的解读。
hadc1.Instance = ADC1;这句我明白,给了adc的地址,接下来就抓瞎了

使用特权

评论回复
板凳
airwill| | 2015-5-29 11:28 | 只看该作者
这是用函数库的编程, 上来第一个让人比较容易晕的问题.
其实对于初学者, 你可以先跳开初始化代码里这些具体的, 后面不常用的结构体. 先走程序架构的路. 这些放在一定的深入后再了解.
怎么了解呢? 打开库函数的帮助, 里面有全部的这些结构定义和用法介绍.
慢慢来吧, 要多看资料.

使用特权

评论回复
地板
xueyechongzi|  楼主 | 2015-5-29 11:42 | 只看该作者
噢,好的,谢谢你,我先看看帮助去

使用特权

评论回复
5
mmuuss586| | 2015-5-29 12:20 | 只看该作者

楼主只能多看资料;

使用特权

评论回复
6
xueyechongzi|  楼主 | 2015-5-29 13:29 | 只看该作者
还是不太理解,比如说
ADC_InitTypeDef定义于文件“stm32f10x_adc.h”:
typedef struct {
u32 ADC_Mode;
FunctionalState ADC_ScanConvMode;
FunctionalState ADC_ContinuousConvMode;
u32 ADC_ExternalTrigConv;
u32 ADC_DataAlign;
u8 ADC_NbrOfChannel;
} ADC_InitTypeDef


这个ADC_DataAlign,是自己定义的吧?没找到在什么地方定义他是align位啊,那为什么说他就代表了align位呢

使用特权

评论回复
7
wind~风| | 2015-5-29 13:46 | 只看该作者
楼主完全不了解寄存器怎么操作的啊,这就是一上来直接库函数的弊端

使用特权

评论回复
8
diweo| | 2015-5-29 14:59 | 只看该作者
xueyechongzi 发表于 2015-5-29 13:29
还是不太理解,比如说
ADC_InitTypeDef定义于文件“stm32f10x_adc.h”:
typedef struct {

typedef struct
{
  uint32_t ADC_Mode;                      /*!< Configures the ADC to operate in independent or
                                               dual mode.
                                               This parameter can be a value of @ref ADC_mode */

  FunctionalState ADC_ScanConvMode;       /*!< Specifies whether the conversion is performed in
                                               Scan (multichannels) or Single (one channel) mode.
                                               This parameter can be set to ENABLE or DISABLE */

  FunctionalState ADC_ContinuousConvMode; /*!< Specifies whether the conversion is performed in
                                               Continuous or Single mode.
                                               This parameter can be set to ENABLE or DISABLE. */

  uint32_t ADC_ExternalTrigConv;          /*!< Defines the external trigger used to start the analog
                                               to digital conversion of regular channels. This parameter
                                               can be a value of @ref ADC_external_trigger_sources_for_regular_channels_conversion */

  uint32_t ADC_DataAlign;                 /*!< Specifies whether the ADC data alignment is left or right.
                                               This parameter can be a value of @ref ADC_data_align */

  uint8_t ADC_NbrOfChannel;               /*!< Specifies the number of ADC channels that will be converted
                                               using the sequencer for regular channel group.
                                               This parameter must range from 1 to 16. */
}ADC_InitTypeDef;

后面不是有注释么??
就你的例子,ADC_DataAlign涉及到ADC_data_align,再查找一下,发现它定义在同一个文件的第158行。
/** @defgroup ADC_data_align
  * @{
  */

#define ADC_DataAlign_Right                        ((uint32_t)0x00000000)
#define ADC_DataAlign_Left                         ((uint32_t)0x00000800)
#define IS_ADC_DATA_ALIGN(ALIGN) (((ALIGN) == ADC_DataAlign_Right) || \
                                  ((ALIGN) == ADC_DataAlign_Left))

使用特权

评论回复
9
xueyechongzi|  楼主 | 2015-5-29 16:25 | 只看该作者
多谢8楼,不过你说的正是我有疑问的地方,定义的是ADC_DataAlign,你说的那个“
#define ADC_DataAlign_Right                        ((uint32_t)0x00000000)
#define ADC_DataAlign_Left                         ((uint32_t)0x00000800)
#define IS_ADC_DATA_ALIGN(ALIGN) (((ALIGN) == ADC_DataAlign_Right) || \
                                  ((ALIGN) == ADC_DataAlign_Left))

弱弱的问一下,ADC_DataAlign在这三句话里是怎么定义的?我只看到定义的是ADC_DataAlign_Right和define ADC_DataAlign_Left。

使用特权

评论回复
10
diweo| | 2015-5-29 19:40 | 只看该作者
标准库的源文件就是这么写的啊。难道你的源文件和我的不一样。?

捕获.JPG (229.23 KB )

捕获.JPG

使用特权

评论回复
11
diweo| | 2015-5-29 19:43 | 只看该作者
至于为什么是0x0000和0x0800,那就看ADC_CR2的bit 11

使用特权

评论回复
12
xueyechongzi|  楼主 | 2015-6-1 09:45 | 只看该作者
多谢你回复,不过有个问题,你说的ADC_DataAlign_Right和define ADC_DataAlign_Left这两个定义,可是这两个不等价于ADC_DataAlign吧?函数里没说ADC_DataAlign由那两个函数组成啊

使用特权

评论回复
13
xueyechongzi|  楼主 | 2015-6-1 09:46 | 只看该作者
晕,想发个信息积分还不够

使用特权

评论回复
14
hjl2832| | 2015-6-1 10:24 | 只看该作者
楼主还没看明白?
#define ADC_DataAlign_Right                        ((uint32_t)0x00000000)
这个的意思不就是寄存器地址的值等于0x00000000吗?你去找对应的寄存器,看它的每一位对应是什么功能就知道了。
#define ADC_DataAlign_Left                         ((uint32_t)0x00000800)从这句看,寄存器的第11位是设置数据对齐方式的,为0时是右对齐,为1时是左对齐。

使用特权

评论回复
15
xueyechongzi|  楼主 | 2015-6-1 14:28 | 只看该作者
本帖最后由 xueyechongzi 于 2015-6-1 14:30 编辑

14楼,我明白寄存器地址的值是那个数,我不明白的是,为什么ADC_DataAlign代表了那个寄存器。我没找到关于那个寄存器的定义。也就是说,什么时候,ADC_CR2这个寄存器的align位定义成了ADC_DataAlign

使用特权

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

本版积分规则

3

主题

21

帖子

1

粉丝