[STM32F1] STM32F100C8T6B芯片的DA转换问题!!

[复制链接]
2532|14
 楼主| niulixue 发表于 2016-12-21 13:25 | 显示全部楼层 |阅读模式
本帖最后由 niulixue 于 2016-12-21 15:53 编辑

STM32F100C8T6B这颗芯片到底有没有 DAC模块??为何实际硬件仿真时连RCC中DAC的时钟都开不了?网上有人说老版本的这款芯片确实没有DAC ,现在新版本带B后缀的是有DAC的,我这款是带B后缀的为何不行?买到假货了??
STM32F100C8T6B.jpg
STM32F100C8T6.png
mmuuss586 发表于 2016-12-21 14:23 | 显示全部楼层
不到DAC的;

你哪里看到带DAC的?
如果是官网发布的,那就找原厂确认下;

如果确实有带,那你要查下你买的芯片批号,是不是属于老芯片了;
 楼主| niulixue 发表于 2016-12-21 15:53 | 显示全部楼层
上面图片说了有啊 刚上传了一张
 楼主| niulixue 发表于 2016-12-21 22:55 | 显示全部楼层
//开时钟:GPIO、DAC
//配置GPIO、DAC
//使能
void DAC_Configuration(void)
{       
        GPIO_InitTypeDef GPIO_InitStructure;
        DAC_InitTypeDef DAC_InitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);        //开启DAC时钟                       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);        /* 打开GPIOA GPIOB的时钟 */       


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 ; //PA4 PA5
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN ;               //模拟输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);                /* 配置DAC IO口为模拟输入模式*/


        DAC_DeInit();  //复位DAC
       
        DAC_InitStructure.DAC_Trigger = DAC_Trigger_None ;
        DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None ;
        DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable ;
       
        DAC_Init(DAC_Channel_1, &DAC_InitStructure);
        DAC_Init(DAC_Channel_2, &DAC_InitStructure);
       
        DAC_Cmd(DAC_Channel_1, ENABLE);
        DAC_Cmd(DAC_Channel_2, ENABLE);
       
          DAC_SoftwareTriggerCmd(DAC_Channel_1,ENABLE);
        DAC_SoftwareTriggerCmd(DAC_Channel_2,ENABLE);
}
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
这一步进入库文件执行打开DAC时钟,但DACEN位没有发生变化!!下图这一位

file:///



DAC使能位

DAC使能位
 楼主| niulixue 发表于 2016-12-21 23:19 | 显示全部楼层
仿真时,DACEN位始终不能改变,直接操作该寄存器置1也不行,效果如下图:

仿真DAC时钟.jpg
 楼主| niulixue 发表于 2016-12-22 11:21 | 显示全部楼层
将程序稍作更改移植到STM32F405RGT6平台,DAC可以正常工作!!
DAC配置如下:
void DAC_Configuration(void)
{       
        GPIO_InitTypeDef GPIO_InitStructure;
        DAC_InitTypeDef DAC_InitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);        //开启DAC时钟
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA , ENABLE);        /* 打开GPIOA时钟 */


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 ;       //PA4 PA5
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN ;                        //模拟输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);                                        /* 配置DAC IO口为模拟输入模式*/


        DAC_DeInit();  //复位DAC
       
        DAC_InitStructure.DAC_Trigger = DAC_Trigger_None ;
        DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None ;
////        DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude =  ;
        DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable ;
       
        DAC_Init(DAC_Channel_1, &DAC_InitStructure);
        DAC_Init(DAC_Channel_2, &DAC_InitStructure);
       
        DAC_SoftwareTriggerCmd(DAC_Channel_1,ENABLE);
        DAC_SoftwareTriggerCmd(DAC_Channel_2,ENABLE);
       
        DAC_Cmd(DAC_Channel_1, ENABLE);
        DAC_Cmd(DAC_Channel_2, ENABLE);
}



能否说明我买到了假货STM32F100C8T6B ???? 刚焊接上去的STM32F100C8T6B 自身DAC损坏的可能性应该小吧






crazy2012 发表于 2016-12-26 00:50 | 显示全部楼层
肯定有DAC的我用过。
 楼主| niulixue 发表于 2016-12-26 21:04 | 显示全部楼层
目前基本知道原因了,芯片是假货!!故意配置系统时钟为内部HSI的1/2,然后PLL设置13倍频!
硬件仿真跟踪函数RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);竟然可以跑到52MHz!!!!
真正的STM32F100C8T6只能跑到24M!!如果不是假货还有天理吗?
这种鸟事竟然被我碰上了!!各位小心啊!!

之前听说周立功的芯片有可以直接替代STM32相应产品的,难道.........
 楼主| niulixue 发表于 2016-12-26 21:10 | 显示全部楼层
crazy2012 发表于 2016-12-26 00:50
肯定有DAC的我用过。

请问STM32F100C8T6在使用MDK在使用软件仿真时,图中这个位置一般怎么设置,MDK下默认的设置无法进行软件仿真,进不去主函数,且总是报错,请指教,谢谢!!

STM32F100C8T6软件仿真设置

STM32F100C8T6软件仿真设置
沉默胜过白金 发表于 2016-12-26 21:41 | 显示全部楼层
你这个有DAC,因为是C8T6B,带B的有DAC,不带的则没有。这个片子建议不要超频,也就是在24MHz运行就好了。

若是程序根据F103改的,要注意下初始化的时钟,改为24MHz,一定要改,否则,直接死机。
沉默胜过白金 发表于 2016-12-26 21:45 | 显示全部楼层
看你调了好几天,没调出来,也不是很忍心,看你也是老用户了,发你个寄存器版的程序吧,切记将系统时钟改为 24MHz !!!

  1. #include "stm32f10x.h"

  2. void DAC_Initial(unsigned char channel)                //channel = 1,2
  3. {
  4.         RCC->APB1ENR |= 1 << 29;                //RCC DAC
  5.         RCC->APB2ENR |= 1 << 2;                        //RCC PA
  6.        
  7.         if(channel == 1)
  8.         {
  9.                 GPIOA->CRL &= 0xfff0ffff;
  10.                 //default:DAC channel1 DMA mode disabled,Unmask bit0 of LFSR/ Triangle Amplitude equal to 1,
  11.                 //00: wave generation disabled,DAC channel1 output buffer enabled,
  12.                 DAC->CR |= 7 << 3;                        //Software trigger
  13.                 DAC->CR |= 1 << 2;                        //DAC channel1 trigger enable
  14.                 DAC->CR |= 1 << 0;                        //DAC channel1 enable
  15.         }
  16.         if(channel == 2)
  17.         {
  18.                 GPIOA->CRL &= 0xff0fffff;
  19.                 //default:DAC channel2 DMA mode disabled,Unmask bit0 of LFSR/ Triangle Amplitude equal to 1,
  20.                 //00: wave generation disabled,DAC channel2 output buffer enabled,
  21.                 DAC->CR |= 7 << 19;                        //Software trigger
  22.                 DAC->CR |= 1 << 18;                        //DAC channel2 trigger enable
  23.                 DAC->CR |= 1 << 16;                        //DAC channel2 enable
  24.         }
  25. }

  26. void DAC_Software_Trigger(unsigned char channel)        //channel = 1,2
  27. {
  28.         //This bit is reset by hardware (one APB1 clock cycle later) once the DAC_DHRx registervalue is loaded to the DAC_DORx register.
  29.         if(channel == 1)
  30.                 DAC->SWTRIGR |= 1 << 0;
  31.         if(channel == 2)
  32.                 DAC->SWTRIGR |= 1 << 1;

  33. }

  34. void DAC_Output(unsigned char channel,unsigned char lenth,unsigned short data)        //channel = 1,2;lenth = 8,12(bits);右对齐;data为输出数据
  35. {                               
  36.         if(channel == 1)
  37.         {
  38.                 if(lenth == 8)
  39.                 {
  40.                         DAC->DHR8R1 = data;
  41.                 }
  42.                 if(lenth == 12)
  43.                 {
  44.                         DAC->DHR12R1 = data;
  45.                 }
  46.         }
  47.         if(channel == 2)
  48.         {
  49.                 if(lenth == 8)
  50.                 {
  51.                         DAC->DHR8R2 = data;
  52.                 }
  53.                 if(lenth == 12)
  54.                 {
  55.                         DAC->DHR12R2 = data;
  56.                 }
  57.         }
  58.        
  59.         DAC_Software_Trigger(channel);
  60. }

  61. void Soft_Delay(uint32_t t)
  62. {
  63.         while(t --);
  64. }

  65. int main(void)
  66. {
  67.         uint8_t i = 0;
  68.        
  69.         DAC_Initial(1);
  70.         DAC_Initial(2);
  71.         DAC_Output(1,12,64);
  72.        
  73.         DAC_Output(2,12,500);
  74.        
  75.         while(1)
  76.         {
  77.                 for(i = 0;i < 200;i ++)
  78.                 {
  79.                         DAC_Output(2,12,300 + i);
  80.                         Soft_Delay(2000000);
  81.                        
  82.                 }
  83.         }
  84.         while(1);
  85. }

评分

参与人数 1威望 +1 收起 理由
xbexbexbexbe + 1 很给力!

查看全部评分

沉默胜过白金 发表于 2016-12-26 21:50 | 显示全部楼层
mmuuss586 发表于 2016-12-21 14:23
不到DAC的;

你哪里看到带DAC的?

带B的就有,除非那个b是后来加上的。
 楼主| niulixue 发表于 2016-12-27 12:51 | 显示全部楼层
沉默胜过白金 发表于 2016-12-26 21:50
带B的就有,除非那个b是后来加上的。

谢谢大家的支持!我那个芯片确实是假货,内部没有DAC模块,今天从另外一个渠道购买回来的芯片装上后,OK! DAC输出正常了!我那个假货芯片能跑到52MHz的主频难道是STM32F103C8T6改的激光标??下面上传一张新购买的芯片微距下的裸照:



正规渠道购买的芯片

正规渠道购买的芯片
 楼主| niulixue 发表于 2016-12-27 12:53 | 显示全部楼层
我再上传一张假货芯片的丝印照片,最上面楼上也有的,一对比就看出来确实丝印就有问题:




假货芯片的丝印.jpg
Bjorn 发表于 2016-12-28 21:23 | 显示全部楼层
这个片子建议不要超频,也就是在24MHz运行
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

30

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部