OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4012|回复: 6

串口二使能后跟FATFS文件系统冲突问题

[复制链接]

2

主题

11

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2021-11-21
在线时间
7 小时
发表于 2021-12-1 17:19:10 | 显示全部楼层 |阅读模式
1金钱
前情提要:我用mini板做一个拍照功能(借鉴论坛网友以及原子哥的摄像头实验),这部分功能已经完成了。现在我想进一步将得到的数据通过蓝牙(串口二)传输到电脑上,但是我初始化串口2后,拍照功能就不行了,写入文件的返回值是1,而且bmp_encode执行得还很慢。下面贴上初始化串口二和拍照的代码。

最佳答案

查看完整内容[请看2#楼]

正点原子的MINISTM32板子的SD_CS是用PA3的,PA3也是串口2的引脚,应该是公用了,导致串口2和拍照功能不能同时用
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

369

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4241
金钱
4241
注册时间
2020-7-24
在线时间
714 小时
发表于 2021-12-1 17:19:11 | 显示全部楼层
正点原子的MINISTM32板子的SD_CS是用PA3的,PA3也是串口2的引脚,应该是公用了,导致串口2和拍照功能不能同时用
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2021-11-21
在线时间
7 小时
 楼主| 发表于 2021-12-1 17:20:44 | 显示全部楼层
串口二初始化:
void usart2_init(u32 bound)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// GPIOAê±Öó
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

    USART_DeInit(USART2);                                //¸′λ′®¿ú1
    //USART2_TX   PA.2
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;            //PA.2
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;             //¸′óÃíÆíìêä3ö
    GPIO_Init(GPIOA, &GPIO_InitStructure);               //3õê¼»ˉPA2

    //USART2_RX          PA.3
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;            //PA.3
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        //éÏà-êäèë
    GPIO_Init(GPIOA, &GPIO_InitStructure);               //3õê¼»ˉPA3

    USART_InitStructure.USART_BaudRate = bound;                                    //ò»°ãéèÖÃÎa9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;                    //×Ö3¤Îa8λêy¾Y¸ñê½
    USART_InitStructure.USART_StopBits = USART_StopBits_1;                         //ò»¸öí£Ö1λ
    USART_InitStructure.USART_Parity = USART_Parity_No;                            //ÎTÆæÅ¼D£Ñéλ
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎTó2¼têy¾Yá÷¿ØÖÆ
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                       //êÕ·¢Ä£ê½

    USART_Init(USART2, &USART_InitStructure); //3õê¼»ˉ′®¿ú2

    //2¨ìØÂêéèÖÃ
    //USART2->BRR=(pclk1*1000000)/(bound);// 2¨ìØÂêéèÖÃ
    //USART2->CR1|=0X200C;          //1λí£Ö1,ÎTD£Ñéλ.
    USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE);                           //ê1Äü′®¿ú2μÄDMA·¢Ëí
    UART_DMA_Config(DMA1_Channel7, (u32)&USART2->DR, (u32)USART2_TX_BUF); //DMA1í¨μà7,íaéèÎa′®¿ú2,′æ′¢Æ÷ÎaUSART2_TX_BUF
    USART_Cmd(USART2, ENABLE);                                         //ê1Äü′®¿ú

#ifdef USART2_RX_EN                          //èç1ûê1Äüá˽óêÕ
    //ê1Äü½óêÕÖD¶Ï
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//¿aÆôÖD¶Ï

    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2 ; //ÇàÕ¼óÅÏè¼¶3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //×óóÅÏè¼¶3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQí¨μàê1Äü
    NVIC_Init(&NVIC_InitStructure);        //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉVIC¼Ä′æÆ÷

    TIM4_Init(99, 7199);                //10msÖD¶Ï
    USART2_RX_STA = 0;                //Çåáã
    TIM4_Set(0);                        //1رն¨ê±Æ÷4
#endif
拍照:
u8 bmp_encode(u8 *filename,u16 x,u16 y,u16 width,u16 height,u8 mode)
{                               
        FIL* f_bmp;
        u16 bmpheadsize;                        //bmpí·′óD¡                  
        BITMAPINFO hbmp;                        //bmpí·         
        u8 res=0;
        u16 tx,ty;                                           //í¼Ïñ3ß′ç
        u16 *databuf;                                //êy¾Y»o′æÇøμØÖ·                  
        u16 pixcnt;                                           //ÏñËØ¼ÆêyÆ÷
        u16 bi4width;                               //ˮƽÏñËØ×Ö½úêy          
        if(width==0||height==0)return PIC_WINDOW_ERR;        //Çøóò′íÎó
        if((x+width-1)>lcddev.width)return PIC_WINDOW_ERR;                //Çøóò′íÎó
        if((y+height-1)>lcddev.height)return PIC_WINDOW_ERR;        //Çøóò′íÎó
         
#if BMP_USE_MALLOC == 1        //ê1óÃmalloc       
        databuf=(u16*)mymalloc(1024);                //¿a±ùÖáéùbi4width′óD¡μÄ×Ö½úμÄÄú′æÇøóò ,¶Ô240¿íμÄÆá,480¸ö×Ö½ú¾í1»áË.
        if(databuf==NULL)return PIC_MEM_ERR;                //Äú′æéêÇëê§°ü.
        f_bmp=(FIL *)mymalloc(sizeof(FIL));        //¿a±ùFIL×Ö½úμÄÄú′æÇøóò
        if(f_bmp==NULL)                                                                //Äú′æéêÇëê§°ü.
        {                 
                myfree(databuf);
                return PIC_MEM_ERR;                               
        }          
#else
        databuf=(u16*)bmpreadbuf;
        f_bmp=&f_bfile;
#endif             
        bmpheadsize=sizeof(hbmp);//μÃμ½bmpÎļtí·μÄ′óD¡   
        mymemset((u8*)&hbmp,0,sizeof(hbmp));//ÖÃáã¿ÕéêÇëμ½μÄÄú′æ.            
        hbmp.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);//DÅÏ¢í·′óD¡
        hbmp.bmiHeader.biWidth=width;                 //bmpμÄ¿í¶è
        hbmp.bmiHeader.biHeight=height;         //bmpμĸ߶è
        hbmp.bmiHeader.biPlanes=1;                         //oãÎa1
        hbmp.bmiHeader.biBitCount=16;                 //bmpÎa16λé«bmp
        hbmp.bmiHeader.biCompression=BI_BITFIELDS;//ÿ¸öÏóËØμıèìØóéÖ¸¶¨μÄÑúÂë¾ö¶¨¡£
        hbmp.bmiHeader.biSizeImage=hbmp.bmiHeader.biHeight*hbmp.bmiHeader.biWidth*hbmp.bmiHeader.biBitCount/8;//bmpêy¾YÇø′óD¡
                                  
        hbmp.bmfHeader.bfType=((u16)'M'<<8)+'B';//BM&#184;&#241;ê&#189;±ê&#214;&#190;
        hbmp.bmfHeader.bfSize=bmpheadsize+hbmp.bmiHeader.biSizeImage;//&#213;&#251;&#184;&#246;bmpμ&#196;′óD&#161;
           hbmp.bmfHeader.bfOffBits=bmpheadsize;//μ&#189;êy&#190;Y&#199;&#248;μ&#196;&#198;&#171;ò&#198;

        hbmp.RGB_MASK[0]=0X00F800;                         //oìé&#171;&#209;ú&#194;&#235;
        hbmp.RGB_MASK[1]=0X0007E0;                         //&#194;ìé&#171;&#209;ú&#194;&#235;
        hbmp.RGB_MASK[2]=0X00001F;                         //à&#182;é&#171;&#209;ú&#194;&#235;

        if(mode==1)res=f_open(f_bmp,(const TCHAR*)filename,FA_READ|FA_WRITE);//3¢ê&#212;′ò&#191;a&#214;&#174;&#199;°μ&#196;&#206;&#196;&#188;t
        if(mode==0||res==0x04)res=f_open(f_bmp,(const TCHAR*)filename,FA_WRITE|FA_CREATE_NEW);//&#196;£ê&#189;0,&#187;ò&#213;&#223;3¢ê&#212;′ò&#191;aê§°ü,&#212;ò′′&#189;¨D&#194;&#206;&#196;&#188;t                  
        if((hbmp.bmiHeader.biWidth*2)%4)//&#203;&#174;&#198;&#189;&#207;&#241;&#203;&#216;(×&#214;&#189;ú)2&#187;&#206;a4μ&#196;±&#182;êy
        {
                bi4width=((hbmp.bmiHeader.biWidth*2)/4+1)*4;//êμ&#188;êòaD′è&#235;μ&#196;&#191;í&#182;è&#207;&#241;&#203;&#216;,±&#216;D&#235;&#206;a4μ&#196;±&#182;êy.       
        }else bi4width=hbmp.bmiHeader.biWidth*2;                //&#184;&#213;o&#195;&#206;a4μ&#196;±&#182;êy         
        if(res==FR_OK)//′′&#189;¨3é1|
        {
                res=f_write(f_bmp,(u8*)&hbmp,bmpheadsize,&bw);//D′è&#235;BMPê×2&#191;  
                for(ty=y+height-1;hbmp.bmiHeader.biHeight;ty--)
                {
                        pixcnt=0;
                        for(tx=x;pixcnt!=(bi4width/2);)
                        {
                                if(pixcnt<hbmp.bmiHeader.biWidth)databuf[pixcnt]=LCD_ReadPoint(tx,ty);//&#182;áè&#161;×&#248;±êμ&#227;μ&#196;&#214;μ
                                else databuf[pixcnt]=0Xffff;//213&#228;°×é&#171;μ&#196;&#207;&#241;&#203;&#216;.  
                                pixcnt++;
                                tx++;
                        }
                        hbmp.bmiHeader.biHeight--;
                        res=f_write(f_bmp,(u8*)databuf,bi4width,&bw);//D′è&#235;êy&#190;Y
                }
                f_close(f_bmp);
        }          

#if BMP_USE_MALLOC == 1        //ê1ó&#195;malloc       
        myfree(databuf);         
        myfree(f_bmp);                 
#endif       
        return res;
}
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2021-11-21
在线时间
7 小时
 楼主| 发表于 2021-12-1 21:27:03 | 显示全部楼层
有没有大佬指点迷津,求求了
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2021-11-21
在线时间
7 小时
 楼主| 发表于 2021-12-2 11:37:53 | 显示全部楼层
GJJ1999 发表于 2021-12-2 10:35
正点原子的MINISTM32板子的SD_CS是用PA3的,PA3也是串口2的引脚,应该是公用了,导致串口2和拍照功能不能同 ...

这样?那能复用SD或者改引脚吗?串口的应该不能改。。
回复

使用道具 举报

11

主题

2158

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5003
金钱
5003
注册时间
2015-1-10
在线时间
627 小时
发表于 2021-12-3 09:48:41 | 显示全部楼层
xhp123 发表于 2021-12-2 11:37
这样?那能复用SD或者改引脚吗?串口的应该不能改。。

蓝牙换成串口3呢
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2021-11-21
在线时间
7 小时
 楼主| 发表于 2021-12-3 14:43:29 | 显示全部楼层

串口3的引脚我倒是没去了解,不过我现在不用SD了,蓝牙传输就可以了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-18 16:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表