打印
[STM32F1]

STM32F100C8T6B芯片的DA转换问题!!

[复制链接]
2157|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
niulixue|  楼主 | 2016-12-21 13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 niulixue 于 2016-12-21 15:53 编辑

STM32F100C8T6B这颗芯片到底有没有 DAC模块??为何实际硬件仿真时连RCC中DAC的时钟都开不了?网上有人说老版本的这款芯片确实没有DAC ,现在新版本带B后缀的是有DAC的,我这款是带B后缀的为何不行?买到假货了??

STM32F100C8T6B.jpg (83.02 KB )

STM32F100C8T6B.jpg

STM32F100C8T6.png (109.54 KB )

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:///



STM32F100C8T6的DACEN位.png (391.72 KB )

DAC使能位

DAC使能位

使用特权

评论回复
5
niulixue|  楼主 | 2016-12-21 23:19 | 只看该作者
仿真时,DACEN位始终不能改变,直接操作该寄存器置1也不行,效果如下图:

仿真DAC时钟.jpg (146.88 KB )

仿真DAC时钟.jpg

使用特权

评论回复
6
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损坏的可能性应该小吧






使用特权

评论回复
7
crazy2012| | 2016-12-26 00:50 | 只看该作者
肯定有DAC的我用过。

使用特权

评论回复
8
niulixue|  楼主 | 2016-12-26 21:04 | 只看该作者
目前基本知道原因了,芯片是假货!!故意配置系统时钟为内部HSI的1/2,然后PLL设置13倍频!
硬件仿真跟踪函数RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);竟然可以跑到52MHz!!!!
真正的STM32F100C8T6只能跑到24M!!如果不是假货还有天理吗?
这种鸟事竟然被我碰上了!!各位小心啊!!

之前听说周立功的芯片有可以直接替代STM32相应产品的,难道.........

使用特权

评论回复
9
niulixue|  楼主 | 2016-12-26 21:10 | 只看该作者
crazy2012 发表于 2016-12-26 00:50
肯定有DAC的我用过。

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

软件仿真设置.png (25.41 KB )

STM32F100C8T6软件仿真设置

STM32F100C8T6软件仿真设置

使用特权

评论回复
10
沉默胜过白金| | 2016-12-26 21:41 | 只看该作者
你这个有DAC,因为是C8T6B,带B的有DAC,不带的则没有。这个片子建议不要超频,也就是在24MHz运行就好了。

若是程序根据F103改的,要注意下初始化的时钟,改为24MHz,一定要改,否则,直接死机。

使用特权

评论回复
11
沉默胜过白金| | 2016-12-26 21:45 | 只看该作者
看你调了好几天,没调出来,也不是很忍心,看你也是老用户了,发你个寄存器版的程序吧,切记将系统时钟改为 24MHz !!!

#include "stm32f10x.h"

void DAC_Initial(unsigned char channel)                //channel = 1,2
{
        RCC->APB1ENR |= 1 << 29;                //RCC DAC
        RCC->APB2ENR |= 1 << 2;                        //RCC PA
       
        if(channel == 1)
        {
                GPIOA->CRL &= 0xfff0ffff;
                //default:DAC channel1 DMA mode disabled,Unmask bit0 of LFSR/ Triangle Amplitude equal to 1,
                //00: wave generation disabled,DAC channel1 output buffer enabled,
                DAC->CR |= 7 << 3;                        //Software trigger
                DAC->CR |= 1 << 2;                        //DAC channel1 trigger enable
                DAC->CR |= 1 << 0;                        //DAC channel1 enable
        }
        if(channel == 2)
        {
                GPIOA->CRL &= 0xff0fffff;
                //default:DAC channel2 DMA mode disabled,Unmask bit0 of LFSR/ Triangle Amplitude equal to 1,
                //00: wave generation disabled,DAC channel2 output buffer enabled,
                DAC->CR |= 7 << 19;                        //Software trigger
                DAC->CR |= 1 << 18;                        //DAC channel2 trigger enable
                DAC->CR |= 1 << 16;                        //DAC channel2 enable
        }
}

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

}

void DAC_Output(unsigned char channel,unsigned char lenth,unsigned short data)        //channel = 1,2;lenth = 8,12(bits);右对齐;data为输出数据
{                               
        if(channel == 1)
        {
                if(lenth == 8)
                {
                        DAC->DHR8R1 = data;
                }
                if(lenth == 12)
                {
                        DAC->DHR12R1 = data;
                }
        }
        if(channel == 2)
        {
                if(lenth == 8)
                {
                        DAC->DHR8R2 = data;
                }
                if(lenth == 12)
                {
                        DAC->DHR12R2 = data;
                }
        }
       
        DAC_Software_Trigger(channel);
}

void Soft_Delay(uint32_t t)
{
        while(t --);
}

int main(void)
{
        uint8_t i = 0;
       
        DAC_Initial(1);
        DAC_Initial(2);
        DAC_Output(1,12,64);
       
        DAC_Output(2,12,500);
       
        while(1)
        {
                for(i = 0;i < 200;i ++)
                {
                        DAC_Output(2,12,300 + i);
                        Soft_Delay(2000000);
                       
                }
        }
        while(1);
}

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xbexbexbexbe + 1 很给力!
12
沉默胜过白金| | 2016-12-26 21:50 | 只看该作者
mmuuss586 发表于 2016-12-21 14:23
不到DAC的;

你哪里看到带DAC的?

带B的就有,除非那个b是后来加上的。

使用特权

评论回复
13
niulixue|  楼主 | 2016-12-27 12:51 | 只看该作者
沉默胜过白金 发表于 2016-12-26 21:50
带B的就有,除非那个b是后来加上的。

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



正规渠道购买的芯片.png (350.49 KB )

正规渠道购买的芯片

正规渠道购买的芯片

使用特权

评论回复
14
niulixue|  楼主 | 2016-12-27 12:53 | 只看该作者
我再上传一张假货芯片的丝印照片,最上面楼上也有的,一对比就看出来确实丝印就有问题:




假货芯片的丝印.jpg (83.02 KB )

假货芯片的丝印.jpg

使用特权

评论回复
15
Bjorn| | 2016-12-28 21:23 | 只看该作者
这个片子建议不要超频,也就是在24MHz运行

使用特权

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

本版积分规则

5

主题

30

帖子

1

粉丝