Files
TencentOS-tiny/board/TencentOS_Tiny_CH32V307_EVB/User/main.c
Supowang ddb37a743a add spi flash and sd for ch32v307
add spi flash and sd for ch32v307
2022-06-02 17:35:16 +08:00

303 lines
7.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/********************************** (C) COPYRIGHT *******************************
* File Name : main.c
* Author : WCH
* Version : V1.0.0
* Date : 2021/06/06
* Description : Main program body.
*******************************************************************************/
#include "debug.h"
#include "tos_k.h"
#include "sdio.h"
#include "lcd_init.h"
#include "lcd.h"
#include "pic.h"
#include "spi_flash.h"
void led_key_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_2);
GPIO_SetBits(GPIOE,GPIO_Pin_3);
GPIO_SetBits(GPIOE,GPIO_Pin_4);
GPIO_SetBits(GPIOE,GPIO_Pin_5);
/* key 1 2 3 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
uint8_t get_key(void)
{
uint16_t value=0;
if((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) & GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)\
& GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)) == 0 )
{
Delay_Ms(15);
if((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) & GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)\
& GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)) == 0 )
{
value= GPIO_ReadInputData(GPIOA);
if((value&0x1)==0) return 1;
else if((value&0x2)==0)return 2;
else if((value&0x100)==0) return 3;
else return 0;
}
}
return 0;
}
/*********************************************************************
* @fn show_sdcard_info
*
* @brief SD Card information.
*
* @return none
*/
void show_sdcard_info(void)
{
switch(SDCardInfo.CardType)
{
case SDIO_STD_CAPACITY_SD_CARD_V1_1:printf("Card Type:SDSC V1.1\r\n");break;
case SDIO_STD_CAPACITY_SD_CARD_V2_0:printf("Card Type:SDSC V2.0\r\n");break;
case SDIO_HIGH_CAPACITY_SD_CARD:printf("Card Type:SDHC V2.0\r\n");break;
case SDIO_MULTIMEDIA_CARD:printf("Card Type:MMC Card\r\n");break;
}
printf("Card ManufacturerID:%d\r\n",SDCardInfo.SD_cid.ManufacturerID);
printf("Card RCA:%d\r\n",SDCardInfo.RCA);
printf("Card Capacity:%d MB\r\n",(u32)(SDCardInfo.CardCapacity>>20));
printf("Card BlockSize:%d\r\n\r\n",SDCardInfo.CardBlockSize);
}
const u8 TEXT_Buf[]={"CH32V307 SPI FLASH W25Qxx"};
void spi_flash_test(void)
{
u8 datap[SIZE];
u16 Flash_Model;
// SPI_Flash_Init();
Delay_Ms(50);
Flash_Model = SPI_Flash_ReadID();
switch(Flash_Model)
{
case W25Q80:
printf("W25Q80 OK!\r\n");
break;
case W25Q16:
printf("W25Q16 OK!\r\n");
break;
case W25Q32:
printf("W25Q32 OK!\r\n");
break;
case W25Q64:
printf("W25Q64 OK!\r\n");
break;
case W25Q128:
printf("W25Q128 OK!\r\n");
break;
default:
printf("Fail!\r\n");
break;
}
printf("Start Erase W25Qxx....\r\n");
SPI_Flash_Erase_Sector(0);
Delay_Ms(500);
printf("Start Read W25Qxx....\r\n");
SPI_Flash_Read(datap,0x0,SIZE);
for(int16_t i=0;i<SIZE;i++)
{
printf("%x ", datap[i] );
}
printf("\r\n" );
Delay_Ms(500);
printf("Start Write W25Qxx....\r\n");
SPI_Flash_Write((u8*)TEXT_Buf,0,SIZE);
Delay_Ms(500);
SPI_Flash_Read(datap,0x0,SIZE);
printf("%s\r\n", datap );
if(memcmp(TEXT_Buf, datap, SIZE))
{
LCD_ShowString(16,16+16+16,"SPI Flash: Fail",WHITE,BLACK,16,0);
}
else
{
LCD_ShowString(16,16+16+16,"SPI Flash: OK",WHITE,BLACK,16,0);
}
}
u8 buf[512];
u8 Readbuf[512];
/* sdcard test */
void SD_Card_test(void)
{
u32 i;
u32 Sector_Nums;
while(SD_Init())
{
printf("SD Card Error!\r\n");
delay_ms(1000);
}
show_sdcard_info();
printf("SD Card OK\r\n");
Sector_Nums = ((u32)(SDCardInfo.CardCapacity>>20))/2;
printf("Sector_Nums:%d\r\n", Sector_Nums);
for(i=0; i<512; i++){
buf[i] = i;
}
for(i=0; i<Sector_Nums/2; i++)
{
if(SD_WriteDisk(buf,i,1)) {printf("Wr %d sector fail\n", i);}
if(SD_ReadDisk(Readbuf,i,1)){ printf("Rd %d sector fail\n", i);}
if(memcmp(buf, Readbuf, 512))
{
printf(" %d sector Verify fail\n", i);
LCD_ShowString(16,16+16+16+16,"SD Sector:FAIL",WHITE,BLACK,16,0);
break;
}
}
if(i==Sector_Nums/2)
{
LCD_ShowString(16,16+16+16+16+16,"SD: OK",WHITE,BLACK,16,0);
printf("SD OK\r\n");
}
else
{
LCD_ShowString(16,16+16+16+16+16,"SD ALL: FAIL",WHITE,BLACK,16,0);
}
}
#define TASK1_STK_SIZE 1024
k_task_t task1;
__aligned(4) uint8_t task1_stk[TASK1_STK_SIZE];
#define TASK2_STK_SIZE 1024
k_task_t task2;
__aligned(4) uint8_t task2_stk[TASK2_STK_SIZE];
#define APPLICATION_TASK_STK_SIZE 4096
k_task_t application_task;
__aligned(4) uint8_t application_task_stk[APPLICATION_TASK_STK_SIZE];
extern void application_entry1(void *arg);
void task1_entry(void *arg)
{
while (1)
{
printf("###I am task1\r\n");
tos_task_delay(2000);
}
}
void task2_entry(void *arg)
{
while (1)
{
printf("***I am task2\r\n");
tos_task_delay(1000);
}
}
volatile uint8_t key=0;
/*******************************************************************************
* Function Name : main
* Description : Main program.
* Input : None
* Return : None
*******************************************************************************/
int main(void)
{
u8 i,j;
float t=0;
Delay_Init();
USART_Printf_Init(115200);
printf("SystemClk:%d\r\n",SystemCoreClock);
led_key_init();
LCD_Init();//LCD<43><44>ʼ<EFBFBD><CABC>
SPI_Flash_Init();
printf("Welcome to TencentOS tiny(%s)\r\n", TOS_VERSION);
LCD_Fill(0,0,LCD_W,LCD_H,BLACK);
LCD_ShowString(0,0,"Welcome to TencentOS",WHITE,BLACK,16,0);
tos_knl_init();
tos_task_create(&application_task, "application_task", application_entry1, NULL, 4, application_task_stk, APPLICATION_TASK_STK_SIZE, 0);
//tos_task_create(&task1, "task1", task1_entry, NULL, 3, task1_stk, TASK1_STK_SIZE, 0); // Create task1
//tos_task_create(&task2, "task2", task2_entry, NULL, 3, task2_stk, TASK2_STK_SIZE, 0);// Create task2
tos_knl_start();
printf("should not run at here!\r\n");
while(!key)
{
key=get_key();
}
switch(key)
{
case 1:
//lcd_test();
break;
case 2:
LCD_Fill(0,0,LCD_W,LCD_H,BLACK);
spi_flash_test();
SD_Card_test();
break;
case 3:
LCD_Fill(0,0,LCD_W,LCD_H,BLACK);
break;
default:
break;
}
while(1)
{
LCD_ShowString(0,0,"Welcome TencentOS",WHITE,BLACK,32,0);
LCD_ShowString(0,40,"LCD_W:",WHITE,BLACK,16,0);
LCD_ShowIntNum(48,40,LCD_W,3,WHITE,BLACK,16);
LCD_ShowString(80,40,"LCD_H:",WHITE,BLACK,16,0);
LCD_ShowIntNum(128,40,LCD_H,3,WHITE,BLACK,16);
LCD_ShowString(80,40,"LCD_H:",WHITE,BLACK,16,0);
LCD_ShowString(0,70,"Increaseing Nun:",WHITE,BLACK,16,0);
LCD_ShowFloatNum1(128,70,t,4,WHITE,BLACK,16);
t+=0.11;
for(j=0;j<3;j++)
{
for(i=0;i<6;i++)
{
LCD_ShowPicture(40*i,120+j*40,40,40,gImage_1);
printf("pic test\r\n");
}
}
printf("lcd test\r\n");
}
}