发新帖我要提问
123
返回列表
打印
[STM32F1]

ST分享大集结 stm32 SD卡分享

[复制链接]
楼主: hanzhen654
手机看帖
扫描二维码
随时随地手机跟帖
41
hanzhen654|  楼主 | 2017-11-26 22:08 | 只看该作者 回帖奖励 |倒序浏览
通过串口1发送字符串.
void USART1_SendWord(uint8_t *wd)
{       
        while(*wd)                      //检测是否发送数据是否为空
        {
                USART_SendData(USART1, *wd);
                while (USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET); //等待发送完毕
                wd++;
        }               
}

使用特权

评论回复
42
hanzhen654|  楼主 | 2017-11-26 22:08 | 只看该作者
通过串口2发送字符串
void USART2_SendWord(uint8_t *wd)
{       
        while(*wd)                      //检测是否发送数据是否为空
        {
                USART_SendData(USART2, *wd);
                while (USART_GetFlagStatus(USART2, USART_FLAG_TC) != SET); //等待发送完毕
                wd++;
        }               
}

使用特权

评论回复
43
hanzhen654|  楼主 | 2017-11-26 22:10 | 只看该作者
如果要使用printf函数的话要添加以下代码
struct __FILE
{
        int handle;
        /* Whatever you require here. If the only file you are using is */
        /* standard output using printf() for debugging, no file handling */
        /* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;
/* 定义_sys_exit()以避免使用半主机模式 */   
_sys_exit(int x)
{
        x = x;
}

使用特权

评论回复
44
hanzhen654|  楼主 | 2017-11-26 22:28 | 只看该作者
使用printf函数要重定向这个fputc函数.
int fputc(int ch, FILE *f)
{
       
        USART_SendData(USART1, (uint8_t) ch);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);
       
        return ch;       
}
////* 寄存器版 */
//int fputc(int ch, FILE *f)
//{      
//        while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
//        USART1->DR = (u8) ch;      
//        return ch;
//}

#endif

#ifdef USE_USART1RX_INTERRUPT

使用特权

评论回复
45
hanzhen654|  楼主 | 2017-11-26 22:30 | 只看该作者
设置接收中断的中断等级,并打开总中断
void USART1_NVIC_RxConfig(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    /* 设置NVIC参数 */
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        //响应优先级为0
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;   //打开USART1的全局中断
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                      //使能。

    NVIC_Init(&NVIC_InitStructure);
}

使用特权

评论回复
46
hanzhen654|  楼主 | 2017-11-26 22:31 | 只看该作者
串口1的中断函数
uint8_t USART1_RX_Buff[64], USART1_RX_State;

void USART1_IRQHandler (void)
{
    uint8_t dat;

    /* 接收中断(接收到的数据必须是0x0D 0x0A结尾(即回车))表示接收结束 */
    if(USART_GetITStatus(USART1, USART_IT_RXNE))
    {

        dat = USART_ReceiveData(USART1);
        /* 没接收完,使用USART1_RX_State的最高位作结束标识 */
        if(((USART1_RX_State & 0x80) == 0) && ((USART1_RX_State & 0x3F) < 63))
        {   
            /* 已经接收到0x0D,使用USART1_RX_State的第6位(从0位开始)作接收到0x0D的标识 */
            if(USART1_RX_State & 0x40)   
            {
                if(dat == 0x0A)    //第二个字节接收到0x0A接收结束
                {
                    USART1_RX_State |= 0x80;
                    USART1_RX_Buff[USART1_RX_State & 0x3F] = 0;   
                }
                else
                {
                    USART1_RX_State = 0;
                }
            }
            else
            {
                if(dat == 0x0D)     //接收到0x0D,标识USART1_RX_State的第6位(从0位开始)
                {
                    USART1_RX_State |= 0x40;   
                }
                else
                {
                    USART1_RX_Buff[USART1_RX_State & 0x3F] = dat;
                    USART1_RX_State++;   
                }
            }
        }
    }   
}

#endif

#ifdef USE_USART2RX_INTERRUPT


使用特权

评论回复
47
hanzhen654|  楼主 | 2017-11-26 22:32 | 只看该作者
设置接收中断的中断等级,并打开总中断
void USART2_NVIC_RxConfig(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    /* 设置NVIC参数 */
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        //响应优先级为0
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;         //打开USART2的全局中断
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                      //使能。

    NVIC_Init(&NVIC_InitStructure);
}

使用特权

评论回复
48
hanzhen654|  楼主 | 2017-11-30 22:46 | 只看该作者
lcd显示SD卡类型
/* 显示SD卡类型 */
    if(SD_TYPE == 0x06)
        {
                GUI_Show12ASCII(0, 105, "SDV2HC OK!", RED, BLACK);
        }
        else if(SD_TYPE == 0x04)
        {
                GUI_Show12ASCII(0, 105, "SDV2 OK!", RED, BLACK);
        }
        else if(SD_TYPE == 0x02)
        {
                GUI_Show12ASCII(0, 105, "SDV1 OK!", RED, BLACK);
        }
        else if(SD_TYPE == 0x01)
        {
                GUI_Show12ASCII(0, 105, "MMC OK!", RED, BLACK);
        }

使用特权

评论回复
49
hanzhen654|  楼主 | 2017-11-30 22:47 | 只看该作者
LCD显示SD卡容量
num[0] = (sdCapacity /10000 % 10) + '0';
        num[1] = (sdCapacity /1000 % 10) + '0';
        num[2] = (sdCapacity /100 % 10) + '0';
        num[3] = (sdCapacity /10 % 10) + '0';
        num[4] = (sdCapacity % 10) + '0';
        GUI_Show12ASCII(0, 126, "SD size:      MB", RED, BLACK);
    GUI_Show12ASCII(64, 126, num, RED, BLACK);                 
        while(1)
        {
                /* LED灯闪烁 */
        i++;
        if(i > 0x2FFFFF)
        {
            i = 0;
            if(ledState == 0xFE)
            {
                ledState = 0xFF;
            }
            else
            {
                ledState = 0xFE;
            }
            LED_SetState(ledState);
        }
        }

使用特权

评论回复
50
hanzhen654|  楼主 | 2017-11-30 22:49 | 只看该作者
本次的对SD的操作主要是通过SPI总线的来实现数据交换,可以在SPI的基础上来设计更多的作品。

使用特权

评论回复
51
hanzhen654|  楼主 | 2017-11-30 22:52 | 只看该作者
这次先结帖了,下次再分享点好点的。

使用特权

评论回复
52
yiyigirl2014| | 2017-11-30 23:32 | 只看该作者
sd卡的接口跟tf的一致吗?

使用特权

评论回复
53
dongnanxibei| | 2017-11-30 23:38 | 只看该作者
我也就会一种spi模式

使用特权

评论回复
54
dongnanxibei| | 2017-11-30 23:38 | 只看该作者
我也就会一种spi模式,简单

使用特权

评论回复
55
heisexingqisi| | 2017-11-30 23:51 | 只看该作者
两种接口方式不同吗?

使用特权

评论回复
56
hanzhen654|  楼主 | 2017-12-26 20:42 | 只看该作者
heisexingqisi 发表于 2017-11-30 23:51
两种接口方式不同吗?

不一样啊。

使用特权

评论回复
57
yyjzd| | 2018-2-23 13:15 | 只看该作者
多谢分享!学习了

使用特权

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

本版积分规则