|
17 | 17 | A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 C0 C1 C2 C3 C4 C5 |
18 | 18 | * CH1/PA15 CH2/PB3 CH3/PB10 CH4/PB11 TIM2四个PWM通道 |
19 | 19 | * PA0 StandBy待机低功耗模式的唤醒按键WKUP(占用0线外部中断) |
20 | | - *... |
| 20 | + * PA4 PA5 DAC_OUT1 DAC_OUT2(hd容量系类外设) |
| 21 | + * PC8/SDIO_D0 PC9/SDIO/D1 PC10/SDIO_D2 SDIO固定引脚,用于接SD卡 |
| 22 | + PC11/SDIO_D3 PC12/SDIO_CK PD2/SDIO_CMD |
21 | 23 |
|
22 | 24 | 用户: * |
23 | 25 | */ |
@@ -1472,3 +1474,239 @@ u16 STMFLASH_ReadHalfWord(u32 faddr) |
1472 | 1474 | } |
1473 | 1475 |
|
1474 | 1476 | #endif |
| 1477 | + |
| 1478 | + |
| 1479 | +/*__________________________DAC________________________________________*/ |
| 1480 | +#if SYSTEM_DAC_OUT1_ENABLE||SYSTEM_DAC_OUT2_ENABLE |
| 1481 | + |
| 1482 | +DAC_HandleTypeDef DAC1_Handler;//DAC句柄 |
| 1483 | + |
| 1484 | +void sys_DAC_ENABLE(void) |
| 1485 | +{ |
| 1486 | + DAC_ChannelConfTypeDef DACCH1_Config; |
| 1487 | + DAC_ChannelConfTypeDef DACCH2_Config; |
| 1488 | + |
| 1489 | + DAC1_Handler.Instance=DAC; |
| 1490 | + HAL_DAC_Init(&DAC1_Handler); //初始化DAC |
| 1491 | + |
| 1492 | + /*通道1配置*/ |
| 1493 | + DACCH1_Config.DAC_Trigger=DAC_TRIGGER_NONE; //不使用触发功能 |
| 1494 | + /*可选: |
| 1495 | + DAC_TRIGGER_T6_TRGO |
| 1496 | + DAC_TRIGGER_T7_TRGO |
| 1497 | + DAC_TRIGGER_T8_TRGO |
| 1498 | + DAC_TRIGGER_T2_TRGO |
| 1499 | + DAC_TRIGGER_T4_TRGO |
| 1500 | + DAC_TRIGGER_EXT_IT9 |
| 1501 | + DAC_TRIGGER_SOFTWARE*/ |
| 1502 | + DACCH1_Config.DAC_OutputBuffer=DAC_OUTPUTBUFFER_DISABLE; //DAC1输出缓冲关闭 |
| 1503 | + /*通道2配置*/ |
| 1504 | + DACCH2_Config.DAC_Trigger=DAC_TRIGGER_NONE; //不使用触发功能 |
| 1505 | + DACCH2_Config.DAC_OutputBuffer=DAC_OUTPUTBUFFER_DISABLE; //DAC1输出缓冲关闭 |
| 1506 | + |
| 1507 | + if(SYSTEM_DAC_OUT1_ENABLE) |
| 1508 | + HAL_DAC_ConfigChannel(&DAC1_Handler,&DACCH1_Config,DAC_CHANNEL_1);//DAC通道1配置 |
| 1509 | + HAL_DAC_Start(&DAC1_Handler,DAC_CHANNEL_1); //开启DAC通道1 |
| 1510 | + if(SYSTEM_DAC_OUT2_ENABLE) |
| 1511 | + HAL_DAC_ConfigChannel(&DAC1_Handler,&DACCH2_Config,DAC_CHANNEL_2);//DAC通道2配置 |
| 1512 | + HAL_DAC_Start(&DAC1_Handler,DAC_CHANNEL_2); //开启DAC通道2 |
| 1513 | + |
| 1514 | + |
| 1515 | +} |
| 1516 | + |
| 1517 | +//DAC底层驱动,时钟配置,引脚 配置 |
| 1518 | +//此函数会被HAL_DAC_Init()调用 |
| 1519 | +//hdac:DAC句柄 |
| 1520 | +void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac) |
| 1521 | +{ |
| 1522 | + if(SYSTEM_DAC_OUT1_ENABLE) |
| 1523 | + { |
| 1524 | + GPIO_InitTypeDef GPIO_Initure; |
| 1525 | + __HAL_RCC_DAC_CLK_ENABLE(); //使能DAC时钟 |
| 1526 | + __HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟 |
| 1527 | + |
| 1528 | + GPIO_Initure.Pin=GPIO_PIN_4; //PA4 |
| 1529 | + GPIO_Initure.Mode=GPIO_MODE_ANALOG; //模拟 |
| 1530 | + GPIO_Initure.Pull=GPIO_NOPULL; //不带上下拉 |
| 1531 | + HAL_GPIO_Init(GPIOA,&GPIO_Initure); |
| 1532 | + } |
| 1533 | + |
| 1534 | + if(SYSTEM_DAC_OUT2_ENABLE) |
| 1535 | + { |
| 1536 | + GPIO_InitTypeDef GPIO_Initure; |
| 1537 | + __HAL_RCC_DAC_CLK_ENABLE(); //使能DAC时钟 |
| 1538 | + __HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟 |
| 1539 | + |
| 1540 | + GPIO_Initure.Pin=GPIO_PIN_5; //PA5 |
| 1541 | + GPIO_Initure.Mode=GPIO_MODE_ANALOG; //模拟 |
| 1542 | + GPIO_Initure.Pull=GPIO_NOPULL; //不带上下拉 |
| 1543 | + HAL_GPIO_Init(GPIOA,&GPIO_Initure); |
| 1544 | + } |
| 1545 | +} |
| 1546 | + |
| 1547 | +//设置通道1输出电压 |
| 1548 | +//vol:0~3.30V |
| 1549 | +void DAC_Set_Ch1_Vol(float vol) |
| 1550 | +{ |
| 1551 | + float temp = vol; |
| 1552 | + temp = (temp/3.30)*4096.0; |
| 1553 | + HAL_DAC_SetValue(&DAC1_Handler,DAC_CHANNEL_1,DAC_ALIGN_12B_R,(uint32_t)temp);//12位右对齐数据格式设置DAC值 |
| 1554 | +} |
| 1555 | + |
| 1556 | +//设置通道2输出电压 |
| 1557 | +//vol:0~3.30V |
| 1558 | +void DAC_Set_Ch2_Vol(float vol) |
| 1559 | +{ |
| 1560 | + float temp = vol; |
| 1561 | + temp = (temp/3.30)*4096.0; |
| 1562 | + HAL_DAC_SetValue(&DAC1_Handler,DAC_CHANNEL_2,DAC_ALIGN_12B_R,(uint32_t)temp);//12位右对齐数据格式设置DAC值 |
| 1563 | +} |
| 1564 | + |
| 1565 | + |
| 1566 | +#endif |
| 1567 | + |
| 1568 | +/*____________________SDIO SD_____________________________________________*/ |
| 1569 | +#if SYSTEM_SDIO_SD_ENABLE |
| 1570 | + |
| 1571 | +SD_HandleTypeDef SDCARD_Handler; //SD卡句柄 |
| 1572 | +HAL_SD_CardInfoTypeDef SDCardInfo; //SD卡信息 |
| 1573 | +HAL_SD_CardCIDTypeDef SDCard_CID; //SD卡CID信息 |
| 1574 | + |
| 1575 | + |
| 1576 | +//SD卡初始化 |
| 1577 | +//返回值:0 初始化正确;其他值,初始化错误 |
| 1578 | +u8 SD_Init(void) |
| 1579 | +{ |
| 1580 | + u8 SD_Error; |
| 1581 | + |
| 1582 | + //初始化时的时钟不能大于400KHZ |
| 1583 | + SDCARD_Handler.Instance=SDIO; |
| 1584 | + SDCARD_Handler.Init.ClockEdge=SDIO_CLOCK_EDGE_RISING; //上升沿 |
| 1585 | + SDCARD_Handler.Init.ClockBypass=SDIO_CLOCK_BYPASS_DISABLE; //不使用bypass模式,直接用HCLK进行分频得到SDIO_CK |
| 1586 | + SDCARD_Handler.Init.ClockPowerSave=SDIO_CLOCK_POWER_SAVE_DISABLE; //空闲时不关闭时钟电源 |
| 1587 | + SDCARD_Handler.Init.BusWide=SDIO_BUS_WIDE_1B; //1位数据线 |
| 1588 | + SDCARD_Handler.Init.HardwareFlowControl=SDIO_HARDWARE_FLOW_CONTROL_ENABLE;//开启硬件流控 |
| 1589 | + SDCARD_Handler.Init.ClockDiv=SDIO_TRANSFER_CLK_DIV; //SD传输时钟频率最大25MHZ |
| 1590 | + |
| 1591 | + SD_Error=HAL_SD_Init(&SDCARD_Handler); |
| 1592 | + if(SD_Error!=HAL_OK) return 1; |
| 1593 | + |
| 1594 | + SD_Error=HAL_SD_ConfigWideBusOperation(&SDCARD_Handler,SDIO_BUS_WIDE_4B);//使能宽总线模式 |
| 1595 | + if(SD_Error!=HAL_OK) return 2; |
| 1596 | + return 0; |
| 1597 | +} |
| 1598 | + |
| 1599 | + |
| 1600 | +//SDMMC底层驱动,时钟使能,引脚配置,DMA配置 |
| 1601 | +//此函数会被HAL_SD_Init()调用 |
| 1602 | +//hsd:SD卡句柄 |
| 1603 | +void HAL_SD_MspInit(SD_HandleTypeDef *hsd) |
| 1604 | +{ |
| 1605 | + DMA_HandleTypeDef TxDMAHandler,RxDMAHandler; |
| 1606 | + GPIO_InitTypeDef GPIO_Initure; |
| 1607 | + |
| 1608 | + __HAL_RCC_SDIO_CLK_ENABLE(); //使能SDIO时钟 |
| 1609 | + //__HAL_RCC_DMA2_CLK_ENABLE(); //使能DMA2时钟 |
| 1610 | + __HAL_RCC_GPIOC_CLK_ENABLE(); //使能GPIOC时钟 |
| 1611 | + __HAL_RCC_GPIOD_CLK_ENABLE(); //使能GPIOD时钟 |
| 1612 | + |
| 1613 | + //PC8,9,10,11,12 |
| 1614 | + GPIO_Initure.Pin=GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12; |
| 1615 | + GPIO_Initure.Mode=GPIO_MODE_AF_PP; //推挽复用 |
| 1616 | + GPIO_Initure.Pull=GPIO_PULLUP; //上拉 |
| 1617 | + GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速 |
| 1618 | + HAL_GPIO_Init(GPIOC,&GPIO_Initure); //初始化 |
| 1619 | + |
| 1620 | + //PD2 |
| 1621 | + GPIO_Initure.Pin=GPIO_PIN_2; |
| 1622 | + HAL_GPIO_Init(GPIOD,&GPIO_Initure); //初始化 |
| 1623 | +} |
| 1624 | + |
| 1625 | +/* |
| 1626 | +//得到卡信息 |
| 1627 | +//cardinfo:卡信息存储区 |
| 1628 | + HAL_SD_GetCardInfo(&SDCARD_Handler,&SDCardInfo); |
| 1629 | +*/ |
| 1630 | + |
| 1631 | +//读SD卡 |
| 1632 | +//buf:读数据缓存区 |
| 1633 | +//sector:扇区地址 |
| 1634 | +//cnt:扇区个数 |
| 1635 | +//返回值:错误状态;0,正常;其他,错误代码; |
| 1636 | +u8 SD_ReadDisk(u8* buf,u32 sector,u32 cnt) |
| 1637 | +{ |
| 1638 | + u8 sta = HAL_OK; |
| 1639 | + u32 timeout=SD_TIMEOUT; |
| 1640 | + long long lsector=sector; |
| 1641 | + INTX_DISABLE();//关闭总中断(POLLING模式,严禁中断打断SDIO读写操作!!!) |
| 1642 | + sta=HAL_SD_ReadBlocks(&SDCARD_Handler, (uint8_t*)buf,lsector,cnt,SD_TIMEOUT);//多个sector的读操作 |
| 1643 | + |
| 1644 | + //等待SD卡读完 |
| 1645 | + while(HAL_SD_GetCardState(&SDCARD_Handler) != HAL_SD_CARD_READY) |
| 1646 | + { |
| 1647 | + if(timeout-- == 0) |
| 1648 | + { |
| 1649 | + sta = HAL_BUSY; |
| 1650 | + } |
| 1651 | + } |
| 1652 | + INTX_ENABLE();//开启总中断 |
| 1653 | + return sta; |
| 1654 | +} |
| 1655 | + |
| 1656 | +//写SD卡 |
| 1657 | +//buf:写数据缓存区 |
| 1658 | +//sector:扇区地址 |
| 1659 | +//cnt:扇区个数 |
| 1660 | +//返回值:错误状态;0,正常;其他,错误代码; |
| 1661 | +u8 SD_WriteDisk(u8 *buf,u32 sector,u32 cnt) |
| 1662 | +{ |
| 1663 | + u8 sta = HAL_OK; |
| 1664 | + u32 timeout=SD_TIMEOUT; |
| 1665 | + long long lsector=sector; |
| 1666 | + INTX_DISABLE();//关闭总中断(POLLING模式,严禁中断打断SDIO读写操作!!!) |
| 1667 | + sta=HAL_SD_WriteBlocks(&SDCARD_Handler,(uint8_t*)buf,lsector,cnt,SD_TIMEOUT);//多个sector的写操作 |
| 1668 | + |
| 1669 | + //等待SD卡读完 |
| 1670 | + while(HAL_SD_GetCardState(&SDCARD_Handler) != HAL_SD_CARD_READY) |
| 1671 | + { |
| 1672 | + if(timeout-- == 0) |
| 1673 | + { |
| 1674 | + sta = HAL_BUSY; |
| 1675 | + } |
| 1676 | + } |
| 1677 | + INTX_ENABLE();//开启总中断 |
| 1678 | + return sta; |
| 1679 | +} |
| 1680 | + |
| 1681 | + |
| 1682 | +//通过串口打印SD卡相关信息 |
| 1683 | +void show_sdcard_info(void) |
| 1684 | +{ |
| 1685 | + uint64_t CardCap; //SD卡容量 |
| 1686 | + |
| 1687 | + HAL_SD_GetCardCID(&SDCARD_Handler,&SDCard_CID); //获取CID |
| 1688 | + HAL_SD_GetCardInfo(&SDCARD_Handler,&SDCardInfo); //获取SD卡信息 |
| 1689 | + switch(SDCardInfo.CardType) |
| 1690 | + { |
| 1691 | + case CARD_SDSC: |
| 1692 | + { |
| 1693 | + if(SDCardInfo.CardVersion == CARD_V1_X) |
| 1694 | + printf_uart(UART1,"Card Type:SDSC V1\r\n"); |
| 1695 | + else if(SDCardInfo.CardVersion == CARD_V2_X) |
| 1696 | + printf_uart(UART1,"Card Type:SDSC V2\r\n"); |
| 1697 | + } |
| 1698 | + break; |
| 1699 | + case CARD_SDHC_SDXC: |
| 1700 | + printf_uart(UART1,"Card Type:SDHC\r\n"); |
| 1701 | + break; |
| 1702 | + } |
| 1703 | + CardCap=(uint64_t)(SDCardInfo.LogBlockNbr)*(uint64_t)(SDCardInfo.LogBlockSize); //计算SD卡容量 |
| 1704 | + printf_uart(UART1,"Card ManufacturerID:%d\r\n",SDCard_CID.ManufacturerID); //制造商ID |
| 1705 | + printf_uart(UART1,"Card RCA:%d\r\n",SDCardInfo.RelCardAdd); //卡相对地址 |
| 1706 | + printf_uart(UART1,"LogBlockNbr:%d \r\n",(u32)(SDCardInfo.LogBlockNbr)); //显示逻辑块数量 |
| 1707 | + printf_uart(UART1,"LogBlockSize:%d \r\n",(u32)(SDCardInfo.LogBlockSize)); //显示逻辑块大小 |
| 1708 | + printf_uart(UART1,"Card Capacity:%d MB\r\n",(u32)(CardCap>>20)); //显示容量(右移20位,以MB显示) |
| 1709 | + printf_uart(UART1,"Card BlockSize:%d\r\n\r\n",SDCardInfo.BlockSize); //显示块大小 |
| 1710 | +} |
| 1711 | + |
| 1712 | +#endif |
0 commit comments